首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使功能异步信号安全?

如何使功能异步信号安全?
EN

Stack Overflow用户
提问于 2013-06-06 16:29:06
回答 2查看 1.5K关注 0票数 8

我有以下sigaction处理程序函数

代码语言:javascript
复制
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();
}

有人告诉我flockprintf不是异步信号安全的。在这个flock中,我找不到一个异步信号安全函数.

根据上述链接:

当信号中断不安全函数而信号捕获函数调用不安全函数时,该行为未定义。

有办法使flock异步信号安全吗?或者,当我接收到flock信号时,是否有另一种执行TERM的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-06 17:12:02

您可以使用fcntl()作为flock()的替代方案。

票数 4
EN

Stack Overflow用户

发布于 2013-06-06 21:21:36

flock()通常是异步信号安全的,因为它是一个系统调用.它的语义使得它很难以不同的方式实现。它不在POSIX的异步信号安全函数列表中,因为它根本不在POSIX中。

您可能不需要显式解锁,因为当引用打开的文件描述的所有文件描述符都关闭时,flock()锁会自动释放。

应该将printf()fprintf()调用替换为适当的write()调用。stdio函数不在异步信号安全函数的列表中,而且通常是强异步信号不安全的。

最好通过将信号设置为默认操作并将其重发到self来替换abort()调用;这样,shell就知道您的程序由于信号而退出,并且可以在适当时中止命令序列。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16967365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档