zoukankan      html  css  js  c++  java
  • 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 。
  • 相关阅读:
    C++ 函数返回数组指针的问题
    cmake 静态调用 c++ dll 的类的一个例子(Clion IDE)[更新1:增加1.模版的应用,2.ma 的算法]
    一月5日
    一月5日
    一月5日
    一月5日
    一月5日
    一月5日
    一月5日
    一月5日
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786614.html
Copyright © 2011-2022 走看看