我有以下sigaction处理程序函数
void signal_term_handler(int sig)
{
printf("EXIT :TERM signal Received!\n");
int rc = flock(pid_file, LOCK_UN | LOCK_NB);
if(rc) {
char *piderr = "PID file unlock failed!";
fprintf(stderr, "%s\n", piderr);
printf(piderr);
}
abort();
}有人告诉我flock和printf不是异步信号安全的。在这个flock中,我找不到一个异步信号安全函数.
根据上述链接:
当信号中断不安全函数而信号捕获函数调用不安全函数时,该行为未定义。
有办法使flock异步信号安全吗?或者,当我接收到flock信号时,是否有另一种执行TERM的解决方案?
发布于 2013-06-06 17:12:02
您可以使用fcntl()作为flock()的替代方案。
发布于 2013-06-06 21:21:36
flock()通常是异步信号安全的,因为它是一个系统调用.它的语义使得它很难以不同的方式实现。它不在POSIX的异步信号安全函数列表中,因为它根本不在POSIX中。
您可能不需要显式解锁,因为当引用打开的文件描述的所有文件描述符都关闭时,flock()锁会自动释放。
应该将printf()和fprintf()调用替换为适当的write()调用。stdio函数不在异步信号安全函数的列表中,而且通常是强异步信号不安全的。
最好通过将信号设置为默认操作并将其重发到self来替换abort()调用;这样,shell就知道您的程序由于信号而退出,并且可以在适当时中止命令序列。
https://stackoverflow.com/questions/16967365
复制相似问题