jm6*_*666 62
默认情况下,信号由内核处理.旧Unix系统有15个信号; 现在他们有更多.你可以检查</usr/include/signal.h>(或杀死-l).CTRL+ C是带名字的信号SIGINT.
处理每个信号的默认操作也在内核中定义,通常它会终止接收信号的进程.
所有信号(但SIGKILL)都可以由程序处理.
这就是shell的作用:
find,运行程序时,shell:
fork本身您也可以trap在shell脚本中发出信号......
您也可以为交互式shell设置信号处理,尝试在您的顶部输入~/.profile.(确保您已经登录并使用其他终端进行测试- 您可以自行锁定)
trap 'echo "Dont do this"' 2
Run Code Online (Sandbox Code Playgroud)
现在,每次在shell中按CTRL+ C,它都会打印一条消息.别忘了删除该行!
如果有兴趣,可以/bin/sh在这里检查源代码中的普通旧信号处理.
在上面的评论中有一些错误信息(现已删除),所以如果有兴趣的人是一个非常好的链接 - 信号处理如何工作.
Jde*_*eBP 21
首先,阅读POSIX终端界面上的维基百科文章.
该SIGINT信号是由终端线纪律产生,并且广播到终端的中的所有进程前台进程组.您的shell已经为您运行的命令(或命令管道)创建了一个新的进程组,并告诉终端该进程组是其(终端的)前台进程组.每个并发命令管道都有自己的进程组,前台命令管道是具有shell已编程到终端中作为终端的前台进程组的进程组的管道.在前台和后台之间切换"作业"(除了一些细节)是shell告诉终端哪个进程组现在是前台进程的问题.
shell进程本身位于另一个进程组中,因此当其中一个进程组位于前台时,它不会收到信号.就这么简单.
终端将INT(中断)信号发送到当前连接到终端的进程.然后程序接收它,并可以选择忽略它,或退出.
没有任何进程被强行关闭(虽然默认情况下,如果你不处理sigint,我相信行为是打电话abort(),但我需要查看它).
当然,正在运行的进程与启动它的shell隔离开来.
如果您想要父shell,请使用以下命令启动您的程序exec:
exec ./myprogram
Run Code Online (Sandbox Code Playgroud)
这样,父shell将被子进程替换
| 归档时间: |
|
| 查看次数: |
57795 次 |
| 最近记录: |