C 为什么这个函数会产生这么多子进程?

C 为什么这个函数会产生这么多子进程?,c,process,C,Process,我编写这段代码是为了使用进程和管道计算数字的阶乘。我想将子进程的结果传递给子进程。例如,创建计算5!作为父亲的总管在管道中发送数字1。然后创建第一个子项并执行1*2,然后将数字2推入管道,第二个子项执行2*3将结果推入管道,等等。。。此外,我使用argv[1][0]认为我们可以这样运行程序。/ex3 5其中5是我们希望找到的阶乘的数字。在运行程序之后,我注意到创建了很多子进程,我只需要4个。为什么呢 在给出建议的答案后,我尝试了以下代码: #include <stdio.h> #in

我编写这段代码是为了使用进程和管道计算数字的阶乘。我想将子进程的结果传递给子进程。例如,创建计算5!作为父亲的总管在管道中发送数字1。然后创建第一个子项并执行1*2,然后将数字2推入管道,第二个子项执行2*3将结果推入管道,等等。。。此外,我使用argv[1][0]认为我们可以这样运行程序。/ex3 5其中5是我们希望找到的阶乘的数字。在运行程序之后,我注意到创建了很多子进程,我只需要4个。为什么呢

在给出建议的答案后,我尝试了以下代码:

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

int fd[1000][2];
int w,count=1,j=0;

void child_creator(){
    pid_t child;
    j++;
    pipe(fd[j]);
    child=fork();
    if (child==0) {
        close(fd[j-1][1]);
        read(fd[j-1][0],&w,sizeof(w));
        close(fd[j-1][0]);
        w=w*count;
        printf("I am child %d , my father is %d , the prod is %d\n",getpid(),getppid(),w);
        sleep(1);

        close(fd[j-1][0]);
        write(fd[j][1],&w,sizeof(w));
        close(fd[j][1]);

        exit(0);        

    }

}       

int main(int argc , char **argv){
    int fact=argv[1][0]-'0';
    w=1;
    for (int i=0; i<fact-1; i++){ 
     count++;
     child_creator();
     sleep(2);
    }

    return 0;
}   

父循环和子循环都返回到主循环中的for循环。由于孩子在写入结果后不需要做任何事情,所以应该退出而不是返回

您在处理管道文件描述符方面也有问题。您确实在子项的开头关闭了fd[1],但稍后尝试写入efd[1],&w,sizeofw。无法向关闭的FD写入。在子进程退出之前,不需要关闭任何内容,而退出进程会自动关闭其所有文件

void child_creator(){
    pid_t child;
    child=fork();
    if (child==0) {
        read(fd[0],&w,sizeof(w));
        w=w*count;
        count++;
        printf("I am child %d , my father is %d , the prod is %d\n",getpid(),getppid(),w);
        sleep(1);
        write(fd[1],&w,sizeof(w));
        exit(0);   
    }
}       

因为您的子代也创建了自己的子代。父代和子代都继续执行for循环。@EugeneSh。我如何修复它并产生相同的结果?@ MaveR98考虑如果'HealthCyror…..返回了子PID,那么在外循环中:如果HealthOngReule==0 {Stule/*Cyt不会再次循环!*/;}。这是否更好地显示了流,以及为什么孩子也在运行parents循环?有很多方法可以解决这个问题。孩子可以退出而不是返回。我也不确定是否每个孩子都使用相同的管道。您无法确定它们是否会按照所需的顺序写入和读取。@maverick98在您编辑之后,您的代码仍然会在尝试写入fd[1]之前关闭它…@MichaelBeer我如何修复它?我取下了盖子[1];但当我运行程序时,它根本不打印任何内容声明一个管道数组,在每个分叉之前创建一个新管道,每个孩子使用适当的管道与系列中的下一个管道进行通信。@Barmar我尝试了你所说的,但我想我做错了什么,我用新代码编辑了这篇文章
void child_creator(){
    pid_t child;
    child=fork();
    if (child==0) {
        read(fd[0],&w,sizeof(w));
        w=w*count;
        count++;
        printf("I am child %d , my father is %d , the prod is %d\n",getpid(),getppid(),w);
        sleep(1);
        write(fd[1],&w,sizeof(w));
        exit(0);   
    }
}