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