信号之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/

相关内容