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

标签 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");每个 if xxx == 0 之后的语句,并且不会打印任何内容。

抱歉没有添加更多细节,我不知道该说什么。说实话,这确实令人困惑。 fork 只是没有按照正常的方式工作?

最佳答案

在 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 不仅等于 0,而且由于 execv() 调用被破坏,子级还会执行额外的 fork 。您的调试器似乎没有跟踪子进程。如果您使用 gdb,请参阅:

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

关于C(UNIX 环境)Fork 系统调用从不返回 0,不创建子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064990/

相关文章:

c - 试图弄清楚 fork() 在这种情况下是如何工作的,但我似乎不明白答案是如何实现的

c - 学习C——测试数据类型

c - 使用 sscanf() 函数解析归档文件

unix - PowerShell 是否已准备好替换 Windows 上的 Cygwin shell?

c - 如何将 UDP 数据包复制到两个或多个套接字

c++ - 流程处理的封装会产生问题

c - BIO_read 始终返回 0

c - 当不确定它是 int 还是 char 时如何从 stdin 中获取值?

bash - 用 sed 搜索和替换 $ 符号

process - 为什么 fork 为 child 返回 0 而为 parent 返回 child 的 PID 而不是 VICE VERSA?