代码之家  ›  专栏  ›  技术社区  ›  Gayan

生成的进程将失效

  •  0
  • Gayan  · 技术社区  · 15 年前

    我使用posix_spanp从主进程生成子进程。

        int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);   
    
        if (iRet != 0)
        {       
            return false;
        }
    

    有时,在子进程没有错误地生成之后,它会突然失效。这怎么可能发生?

    我使用信号处理程序来获取子进程:

    void SigCatcher(int n)
    {       
        while(waitpid( -1, NULL, WNOHANG ) > 0);        
    }
    

    当我杀死一个子进程时,我手动调用它。

        kill(oProcID, SIGKILL);
    
        signal (SIGCHLD, SigCatcher);
    

    这会导致产卵的孩子死亡吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   unwind    15 年前

    这是:

    kill(oProcID, SIGKILL);
    
    signal (SIGCHLD, SigCatcher);
    

    看起来像 race condition . 您需要在终止子进程之前安装信号处理程序,否则可能会丢失信号。

        2
  •  1
  •   Alnitak    15 年前

    你打过电话吗?

    signal(SIGCHLD, SigCatcher);
    

    还有别的地方吗?

    如果您没有,那么您需要在生成任何子进程之前进行此操作,以确保这些子进程在终止时得到收获。

    正如Unwind指出的,您当前调用 kill signal 是不是走错了路。

    典型用途为:

    signal(SIGCHLD, handler);
    posix_spawnp(...);
    ...
    // do other stuff
    ...
    kill(pid, SIGKILL);