Adam Hunt的建議將起作用,前提是您在致電select
之前爲國旗添加支票。它必須在之前,因爲您的正常EINTR
處理可能會跳過檢查,否則退出將延遲,直到您的下一個select
返回一個真實的事件。
while (gContinue) {
/*set up some stuff for next select call*/
do {
if (gContinue == 0) break;
nfds = select(...);
} while (nfds == -1 && errno == EINTR);
/*handle select return*/
}
編輯:迪特里希埃普指出存在的標誌檢查和select
通話只能通過調用關閉,以pselect
之間的競爭條件。 pselect
與select
非常相似,主要區別在於最後一個參數被用作掩碼來確定要阻止哪些信號。所以下面的代碼示例關閉標誌檢查和pselect
電話之間的競爭:
sigset_t emptyset, blockset, origset;
sigemptyset(&emptyset);
sigemptyset(&blockset);
sigaddset(&blockset, SIGINT);
while (gContinue) {
/*...*/
sigprocmask(SIG_BLOCK, &blockset, &origset);
do {
if (gContinue == 0) break;
nfds = pselect(..., &emptyset);
} while (nfds == -1 && errno == EINTR);
sigprocmask(SIG_SETMASK, &origset, NULL);
/*...*/
};
另一種方法是你分配的所有元素註冊到一個全局數據結構,使他們可以通過一個atexit
處理中解放出來的是你安裝。如果您最終獲得解除分配的代碼,請首先從全局數據結構中註銷它;
m = malloc(sz);
register_allocation(m);
/*...*/
unregister_allocation(m);
free(m);
而且使用atexit
:
void cleanup_allocations() {
/*...*/
}
atexit(cleanup_allocations);
來源
2012-07-14 23:51:51
jxh
如果您計劃退出,則無需執行此操作。只有當您計劃繼續時,纔有必要確保沒有泄漏。 – pizza 2012-07-15 02:20:18