fork 创建子进程没有返回-一,但是无法进入子进程

fork 创建子进程没有返回-1,但是无法进入子进程
本帖最后由 Gerryleeke 于 2014-11-13 17:25:24 编辑
我使用fork创建子进程,偶然会出现子进程创建不成功的现象。
类似下面的代码:

pid_t pid;
pid = fork();
if(pid <0)
{
    printf("fork error, errno = %d\n",errno); //没有进到这里
}
if(pid == 0 )
{
    //child
    printf("the child !\n");//有时就会不打出这句,就是都没进到子进程,为啥???
}
{
    //parent
    printf("the parent, my son‘s pid %d\n",pid); //这里一直都可以打出,而且pid是有值的,这个pid也是可以在ps里找到相应的进程(与父进程同名)
}


在这里问一下,有哪些可能会出现这种状况?

系统剩余内存是足够的,有一个多G 的free,系统内核:
Linux c0d66b39c 3.14.13 #1 SMP Wed Sep 3 09:23:59 CST 2014 i686 unknown
------解决思路----------------------
就这段代码来说
如果fork成功
printf("the child !\n");
肯定会被执行的。

无论fork是否成功
printf("the parent, my son‘s pid %d\n",pid);
都会执行。
------解决思路----------------------
就这段代码来说
如果fork成功
printf("the child !\n");
肯定会在子进程里执行的。

无论fork是否成功
printf("the parent, my son‘s pid %d\n",pid);
都会执行。

如果fork成功
printf("the parent, my son‘s pid %d\n",pid);
在父进程和子进程里都会执行。
------解决思路----------------------

/*  
     *启动子进程
     */
    pid = fork();
 
    if(pid < 0)
    {   
        L_ERROR("fork failed, %d\n",errno);
        return FALSE;
    }   
    else if ( pid == 0 ) 
    {   
        /* child */
        L_INFO("LCK::fork new process pid = %d \r\n",getpid());
 
        child_main(tsx_player_fd[0], ping_fd[0]);
        /* never return */
    } 
  else
   {
        /* parent */
  }

------解决思路----------------------
printf("fork error, errno = %d\n",errno); //没有进到这里

这句没打印就是fork 成功了
------解决思路----------------------
你的日志函数是怎么实现的?感觉是日志函数的问题。你把LOG改成printf看看
------解决思路----------------------
正常吧。因为父进程和子进程的执行顺序是不确定的
------解决思路----------------------

11:32:06.529203 00008388 _INFO(utils) LCK:: after fork, pid = 8691
11:32:06.529353 00008388 _INFO(utils) LCK::playerid = 114 child pid = 8691 
 
11:32:06.604253 00008388 _INFO(utils) LCK::parent process return



这个结果可能是父进程先执行然后结束了,如果父进程执行完成,子进程还没有执行完,进程组变成孤儿进程组(此时时孤儿进程组中有停止的进程),父进程会向所有子进程发送SIGHUP信号然后发送SIGCONT信号,如果子进程没有处理SIGHUP就会退出,你的start_player_process没有等待子进程的地方(没调用wait或waitpid),所以当父进程先结束,子进程的进程组一旦变成孤儿进程组且有停止的子进程那么子进程直接退出。

关于孤儿进程组的什么时候收到SIGHUP信号参见《APUE 第三版 9.10节》