为什么此功能会产生这么多子进程?

时间:2019-03-20 21:28:39

标签: c process

我编写此代码是为了使用流程和pipe()计算数字的阶乘。我想将结果从子进程传递到子进程。例如创建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[2];
int w,count=2;

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

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

int main(int argc , char **argv){
    int fact=argv[1][0]-'0';
    pipe(fd);
    w=1;
    for (int i=0; i<fact-1; i++){
         printf("this is i %d\n", i);
        child_creator();
    }
    return 0;
}   

建议答案后,我尝试了以下代码:

#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;
}   

1 个答案:

答案 0 :(得分:1)

父母和孩子都将返回for中的main()循环。由于孩子写完结果后不需要做任何事情,因此应该退出而不是返回。

您在处理管道文件描述符时也遇到了问题。您在孩子开始时做close(fd[1]),但稍后尝试做write(fd[1],&w,sizeof(w))。您无法写入封闭的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);   
    }
}