有人可以解释为什么我下面对 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/