有人可以解释为什么我对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,则每个语句之后的语句都没有打印出来。
很抱歉没有添加更多细节,我不知道还有什么要说的。说实话真的很令人困惑。这些叉子的工作方式不正常......通常应该这样吗?
答案 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