标题:wait4/ptrace/WIFSTOPPED/WIFSIGNALED之间的纠结 出处:Felix021 时间:Sun, 21 Jun 2009 14:30:07 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1662 内容: 话说,虽然felixoj的judge已经在几天前完工, 但是有一个地方是felix没有理解的(因为是copy的sempr大牛的hustoj的流程): 按理,当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", 这样的语句输出。 Generated by Bo-blog 2.1.0