wait4/ptrace/WIFSTOPPED/WIFSIGNALED
按理,当RE/OLE的时候child是会收到SIGSEGV/SIGFPE...等表示RE的信号,或者SIGXFSZ表示OLE的信号
但是在wait4以后WIFSIGNALED(status)并没有得到正确的结果。
Sempr大牛的版本是另做了一些处理:
对此感到非常难以理解,于是咨询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
于是问题就解决了。
最后我的判断条件是:
另外用 strsignal(int sig) 函数获得 信号sig 对应的描述文字并用fprintf(stderr, "%s", 这样的语句输出。
转载请注明出自 http://www.felix021.com/blog/read.php?1662 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: http://www.felix021.com/blog/feed.php 。
但是在wait4以后WIFSIGNALED(status)并没有得到正确的结果。
Sempr大牛的版本是另做了一些处理:
int sig = status >> 8;
if(sig == 5);
else{
switch(sig){
case SIGSEGV: ...
case SIGXFSZ: ...
...
}
}
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))
(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 。