栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何避免在信号处理程序中使用printf?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何避免在信号处理程序中使用printf?

您可以使用一些标志变量,在信号处理程序中设置该标志,并

printf()
在正常操作期间基于main()或程序其他部分中的该标志调用函数。

printf
从信号处理程序中调用所有函数(例如)是不安全的。一种有用的技术是使用信号处理程序设置a
flag
,然后
flag

从主程序中检查它并在需要时打印一条消息。

注意,在下面的示例中,信号处理程序ding()

alarm_fired
在捕获到SIGALRM时将标志设置为1,并
alarm_fired
检查主函数值以有条件地正确调用printf。

static int alarm_fired = 0;void ding(int sig) // can be called asynchronously{  alarm_fired = 1; // set flag}int main(){    pid_t pid;    printf("alarm application startingn");    pid = fork();    switch(pid) {        case -1:  perror("fork failed"); exit(1);        case 0:  sleep(5); kill(getppid(), SIGALRM); exit(0);    }        printf("waiting for alarm to go offn");    (void) signal(SIGALRM, ding);    pause();    if (alarm_fired)  // check flag to call printf      printf("Ding!n");    printf("donen");    exit(0);}

参考:Beginning LinuxProgramming,第4版,在本书中,准确说明了您的代码(所需的内容),第11章:进程和信号,第484页

此外,在编写处理程序函数时需要特别小心,因为它们可以异步调用。也就是说,处理程序可能在程序中的任何地方被意外地调用。如果两个信号在很短的间隔内到达,则一个处理程序可以在另一个处理程序中运行。并且,最好声明为

volatilesigatomic_t
,始终以原子方式访问此类型,以避免不确定中断对变量的访问。(有关详细信息,请阅读:原子数据访问和信号处理)。

阅读定义信号处理程序:了解如何编写可以使用

signal()
sigaction()
函数建立的信号处理程序功能。手册页
中授权功能的列表,在信号处理程序中调用此功能是安全的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367611.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号