C(UNIX环境)Fork系统调用从不返回0,不创建子进程

时间:2014-11-21 15:38:59

标签: c unix fork

有人可以解释为什么我对fork下面的调用没有做任何事情吗?它们永远不会等于零或负面,它们只是正面的。所以我永远不会进入/创建任何子进程。

我无法创建子B,C或D,因为fork调用不执行任何操作。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

//Creates Three Processes B,C,D which communicate data through pipes.
int main() {
  int     fd[2], nbytes;
  pid_t   childpidB, childpidC, childpidD;
  pipe(fd);
  if((childpidB = fork()) < 0)
    {
      perror("fork B error.\n");
      exit(1);
    }
  if(childpidB == 0) //
    {
      close(fd[0]);
      char writeparam[100];
      sprintf(writeparam, "%d", fd[0]);
      char *arg[3];
      arg[0] = "PipeW1";
      arg[1] = writeparam[100];
      arg[2] = NULL;
      execv("PipeW1",arg);
      close(fd[1]);
    }
  if((childpidC = fork()) < 0)
    {
      perror("fork C error.\n");
      exit(1);
    }
  if(childpidC == 0) 
    {
      close(fd[0]);
      char writeparam[100];
      sprintf(writeparam, "%d", fd[0]);
      char *arg[3];
      arg[0] = "PipeW2";
      arg[1] = writeparam[100];
      arg[2] = NULL;
      execv("PipeW2",arg);
      close(fd[1]);
    }
  if((childpidD = fork()) < 0)
    {
      perror("fork D error\n");
      exit(1);
    }
  if(childpidD == 0) 
    {
      close(fd[1]);
      char readparam[100];
      sprintf(readparam, "%d", fd[1]);
      char *arg[3];
      arg[0] = "PipeR";
      arg[1] = readparam[100];
      arg[2] = NULL;
      execv("PipeR",arg);
      close(fd[0]);
    }
  return 0;
}

这真的让我感到害怕,因为它毫无意义。我的调试器可能有问题吗?为了添加更多细节,我尝试添加printf(“GOT HERE”);如果xxx == 0,则每个语句之后的语句都没有打印出来。

很抱歉没有添加更多细节,我不知道还有什么要说的。说实话真的很令人困惑。这些叉子的工作方式不正常......通常应该这样吗?

1 个答案:

答案 0 :(得分:1)

在fork调用后添加printfs以打印生成的pid:

 ./fk 
 childpidB = 3311
 childpidB = 0
 childpidC = 3312
 childpidC = 0
 childpidD = 3313
 childpidD = 3314
 childpidC = 3316
 childpidD = 3317
 childpidD = 0
 childpidD = 0
 childpidD = 0
 childpidC = 0
 childpidD = 331a
 childpidD = 0

因此,pid不仅等于零,因为execv()调用被破坏,所以孩子们正在执行额外的分叉。您的调试器似乎没有跟踪子进程。如果您正在使用gdb,请参阅:

https://sourceware.org/gdb/current/onlinedocs/gdb/Forks.html#Forks