我最近遇到了一个信号问题。我想用C编写一个程序,它会在信号发送到进程后打印任何东西。例如:如果我发送SIGTERM到我的进程(这只是运行程序),我希望程序打印出例如“杀死进程被拒绝”而不是杀死进程。那么该怎么做?如何强制过程捕捉和改变这种信号的含义。我还有一个问题,如果有任何可能杀死init进程(我知道这是一个愚蠢的问题,但我想知道linux如何处理这样的信号,以及如果我输入:sudo kill -9 1
。如何更改C程序中SIGTERM的含义
回答
请勿使用信号处理程序进行打印。你可以设置volatile sig_atomic_t
类型的变量来代替,和你的主线程检查这个(见this例子)。
当你的主线程有没有别的事可做(这应该是大部分时间),让它阻塞一个阻塞函数调用(例如sleep()
),它将在收到信号时立即唤醒(并设置errno
到EINTR
)。
C++疑难杂症:与C sleep()
功能,std::this_thread::sleep_for()
(在最新版本的glibc)不不唤醒接收到信号时。
至于是否有可能杀PID 1,看this question。答案似乎是没有,但我记得当我用init =/bin/bash启动后,Linux变得非常暴躁,后来退出了这个shell - 必须重新启动。
如果你正在寻找麻烦,更好kill pid -1。
'volatile'可能不够用。无论是我们'_Atomic()'变量还是'sig_atomic_t'。 – Olaf
@Olaf,谢谢,添加了一个sig_atomic_t。 – user2394284
鉴于这是针对Linux的,而不是标准C,所以在信号处理程序中可以做的事情要比标准C中允许的要多得多。有一系列系统调用可用于[如何避免使用printf()例如,在一个信号处理程序中(http://stackoverflow.com/questions/16891019/)。该名单有时是折衷主义的; 'write()'是允许的,但'strlen()'不正式。例如,POSIX标准中有更多的细节信息 - [Signal Concepts](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04)。 –
- 1. C++更改程序
- 2. 更改外键含义。如何处理?
- 3. 如何在c#中的子程序中更改操作?
- 4. 更改C#自定义操作中的安装程序属性
- 5. 如何更改WebStorm中的自定义格式化程序
- 6. 如何使用C程序中的exec命令更改目录?
- 7. C#更改制作程序
- 8. cassandra中拥有%的含义以及如何更改它?
- 9. 如何处理SIGTERM
- 10. 在活动的Rails应用程序中更改config.time_zone的含义是什么?
- 11. 如何在Windows中从C#程序更改文件权限?
- 12. 如何保持更改时间在C#web应用程序中
- 13. 如何在我的应用程序中包含无法更改的图像?
- 14. 如何更改Android应用程序的已定义API版本?
- 15. 更改AC_CHECK_HEADER中包含的顺序
- 16. 如何更改C程序的输出而不进行编辑?
- 17. 如何在C/C++程序中包含SQL语句?
- 18. C预处理程序中__real__的含义是什么?
- 19. 如何更改指针访问操作符的含义
- 20. 如何更改进程名称objective-c
- 21. 如何更改定义中的变量
- 22. 如何更改Clickonce安装程序中的更新位置?
- 23. 如何在C++程序中包含流程工具?
- 24. 如何在引导程序中更改导航栏高度? (包含链接)
- 25. Java:如何仅处理SIGTERM?
- 26. 如何摆脱SIGTERM错误
- 27. C#:如何更改包含MDI子项的区域?
- 28. 如何在c#窗口应用程序中更改任务栏中选项卡的更改UI
- 29. 如何轻松更改包含多个文件的应用程序的名称?
- 30. 从C程序更改堆栈内存
签出'sigaction'来截取SIGTERM或SIGINT或其他信号。 –
您无法更改SIGTERM本身的含义;你所能做的就是改变你的程序对收到信号的反应。有一些信号(SIGKILL和SIGSTOP)表示你的进程(程序)无法做任何事情 - 进程无法改变对这些信号的默认响应。 –