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 。
posted @ 2013-09-08 20:35  小尼人00  阅读(601)  评论(0编辑  收藏  举报