wait4/ptrace/WIFSTOPPED/WIFSIGNALED

按理,当RE/OLE的时候child是会收到SIGSEGV/SIGFPE...等表示RE的信号,或者SIGXFSZ表示OLE的信号

但是在wait4以后WIFSIGNALED(status)并没有得到正确的结果。

Sempr大牛的版本是另做了一些处理:
int sig = status >> 8; 
if(sig == 5);
else{
     switch(sig){
         case SIGSEGV: ...
         case SIGXFSZ: ...
        ...
    }
}

对此感到非常难以理解,于是咨询Sempr大牛。

大牛以其强悍的记忆力回忆一年前的事情,大致的回复是

  status >> 8 差不多是EXITCODE
  sig == 5 差不多是正常暂停

于是广搜资料,获得了一些更详细的信息:

WIFSIGNALED: 如果进程是被信号结束的,返回True
  WTERMSIG: 返回在上述情况下结束进程的信号

WIFSTOPPED: 如果进程在被ptrace调用监控的时候被信号暂停/停止,返回True
  WSTOPSIG: 返回在上述情况下暂停/停止进程的信号

另 psignal(int sig, char *s),进行类似perror(char *s)的操作,打印 s, 并输出信号 sig 对应的提示,其中 
sig = 5 对应的是 Trace/breakpoint trap
sig = 11 对应的是 Segmentation fault
sig = 25 对应的是 File size limit exceeded

于是问题就解决了。

最后我的判断条件是:
if(WIFSIGNALED(status) || 
    (WIFSTOPPED(status) && WSTOPSIG(status) != 5))

另外用 strsignal(int sig) 函数获得 信号sig 对应的描述文字并用fprintf(stderr, "%s", 这样的语句输出。

--


转载请注明出自  http://www.felix021.com/blog/read.php?1662  ,如是转载文则注明原出处,谢谢:)
RSS订阅地址:  http://www.felix021.com/blog/feed.php  。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值