system函数的分析

该博文如果能对您有所帮助,不胜荣幸.由于本文完全是本人的理解,如果有错误,或者有其他的建议,请私信我,我会及时的回复或修改.

1. 首先我们来看一下,实现system函数的一些要求:
*a.在执行system的时候,应该屏蔽父进程的SIGINT,SIGQUIT信号*
为什么要这么做呢?
原因:用白话来讲,就是让system函数在执行的时候,获取子进程状态的不受干扰.如果有兴趣的话,可以看一下APUE那本书上的解释,我这里不在赘述.
*b.在实现system函数的时候,应该屏蔽SIGCHLD信号,在最后再解开*
那么为什么呢?
第一点原因:出在waitpid/wait函数上,(先声明一点,waitpid/wait的返回与SIGCLHD信号没有必然的关系)如果在调用system函数的外面注册了关于SIGCHLD的信号处理函数,waitpid/wait函数会等到信号处理函数结束之后,才会返回,所以如果信号处理函数执行的时间过长,那么对system这个函数是不利的.
第二个原因:
如果在外面有信号处理函数要捕捉SIGCHLD信号的话,我们在先前如果没有屏蔽SIGCHLD信号的话,在信号处理函数里面调用了waitpid()/wait()函数的话(很多种情况下都会这么做),那么在信号处理函数里面就将子进程的资源释放了,在system内部的waitpid()就因为获得不到子进程的状态信息,从而返回-1;
如果你有为什么在system内部有waitpid()函数的调用的疑问的话,我的解释是这样的,如果在外面没有调用waitpid怎么办?

下面我们来看一下,system实现的具体代码(有处理信号的方式)

int mysystem(const char* command)
{
    pid_t pid;
    int status;
    struct sigaction ignore,saveintr,savequit;
    sigset_t childmask
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值