信号之system函数
信号之system函数
在http://www.cnblogs.com/nufangrensheng/p/3512291.html中已经有了一个system函数的实现,但是该版本并不执行任何信号处理。POSIX.1要求system忽略SIGINT和SIGQUIT,阻塞SIGCHLD。
实例
程序清单10-19使用http://www.cnblogs.com/nufangrensheng/p/3512291.html中的system版本,用其调用ed(1)编辑器。(ed很久以来就是UNIX的组成部分。在这里调用它的原因是:它是捕捉中断和退出信号的交互式程序。若 从shell调用ed,并键入中断字符,则它捕捉中断信号并打印问号。它还将对退出符的处理方式设置为忽略。
程序清单10-19 用system调用ed编辑器
#include
(signal(SIGINT, sig_int) ==(signal(SIGCHLD, sig_chld) ==(system() <
程序清单10-19用于捕捉SIGINT和SIGCHLD信号。若调用它则可得:
<errno.h><signal.h><unistd.h>
*cmdstring) (cmdstring ==(); = SIG_IGN; &= (sigaction(SIGINT, &ignore, &saveintr) < (-(sigaction(SIGQUIT, &ignore, &savequit) < (-&chldmask); &(sigprocmask(SIG_BLOCK, &chldmask, &savemask) < (-((pid = fork()) < = -; (pid == &&&, , , cmdstring, ( *)); (waitpid(pid, &status, ) < (errno !== -;
(sigaction(SIGINT, &saveintr, NULL) < (-(sigaction(SIGQUIT, &savequit, NULL) < (-(sigprocmask(SIG_SETMASK, &savemask, NULL) < (-
如果链接程序清单10-19与system函数的这一实现,那么所产生的二进制代码与上一个有缺陷的程序相比较,存在如下差别: (1)当我们键入中断或退出字符时,不向调用者进程发送信号。 (2)当ed命令终止时,不向调用进程发送SIGCHLD信号。作为替代,在程序末尾的sigprocmask调用对SIGCHLD信号解除阻塞之前,SIGCHLD信号一直被阻塞。而对sigprocmask函数的这一次调用是在system函数调用waitpid取到子进程的终止状态之后。 system的返回值 注意system的返回值,它是shell的终止状态,但shell的终止状态并不总是执行命令字符串进程的终止状态。 Bourne shell有一个在其文档中没有说清楚的特性:当用一个信号终止了正在执行的命令时,其终止状态是128加上一个信号编号。 用交互方式使用shell可以看到这一点: 在所使用的系统中,SIGINT的值为2,SIGQUIT的值为3,于是给出shell终止状态130、131. 仅当shell本身异常终止时,system的返回值才报告一个异常终止。 在编写使用system函数的程序时,一定要正确地解释返回值。如果直接调用fork、exec和wait,则终止状态与调用system是不同的。 本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
评论暂时关闭