C 如何关闭退出(0)的子进程

C 如何关闭退出(0)的子进程,c,fork,exit,C,Fork,Exit,当我运行以下代码时,有时它工作正常,有时它会给我一个分段错误,并且它会不断生成子进程而不停止。如果我替换则返回0带有出口(0)它总是有效的。有人能解释为什么会这样吗?不应退出(0);在if(pid==0)分支上终止子进程 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> int

当我运行以下代码时,有时它工作正常,有时它会给我一个分段错误,并且它会不断生成子进程而不停止。
如果我替换
则返回0带有
出口(0)它总是有效的。
有人能解释为什么会这样吗?不应
退出(0)
;在
if(pid==0)
分支上终止子进程

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

int main(int argc, char** argv){

    int n;
    int backup;
    int m = atoi(argv[1]);

    FILE* f = fopen("input.dat","r");
    fscanf(f, "%d", &n );
    backup = n;

    int i;
    int x[n];

    for(int i = 0; i < n; i++){
        fscanf(f, "%d", &x[i]);
    }

    pid_t pid;
    int pfd[2];
    int pfd2[2];
    int buf[1];
    int szam[1];

    if(pipe(pfd)){
        printf("Error");
        exit(1);
    }

    if(pipe(pfd2)){
        printf("Error");
        exit(1);
    }

    int k;
    int db=-1;
    int maradek;

    while( n > 0){
        if(m>=n){
            fflush(stdout);
            k=n;
            n=0;
        }else{
            while(maradek < n && maradek < m){
                maradek++;
            }
            k=maradek;
            n=n-maradek;
        }
        for(i = 1; i<=k; i++){
            pid = fork();
            if(pid < 0){
                printf("Error");    
                exit(1);
            }else{
                if(pid == 0){
                    int szam=0;
                    int tomb[1];
                    read(pfd[0],buf,4);
                    szam = buf[0];
                    szam++;
                    tomb[0]=szam;
                    write(pfd2[1],tomb,sizeof(tomb));
                    exit(0);    
                }else{
                    db++;
                    szam[0]=x[db];
                    write(pfd[1],szam,sizeof(szam));
                }
            }
        }
    }

    int max=0;
    int status;
    while (backup > 0) {
        pid = wait(&status);
        read(pfd2[0],buf,4);
        //printf("%d ", buf[0]);
        if(buf[0] > max){
            max = buf[0];
        }
        --backup;

    }

    printf("a legnagyobb primtenyezo osszeg: %d\n",max);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
int n;
int备份;
int m=atoi(argv[1]);
文件*f=fopen(“input.dat”,“r”);
fscanf(f、%d、&n);
备份=n;
int i;
int x[n];
对于(int i=0;i0){
如果(m>=n){
fflush(stdout);
k=n;
n=0;
}否则{
while(maradek最大值){
max=buf[0];
}
--备份;
}
printf(“legnagyobb primtenyezo osszeg:%d\n”,最大值);
返回0;
}

使用自我解释和英语标识符可以更轻松地帮助您分析代码。对我来说,程序总是因分段错误而崩溃。
返回0
退出(0)
应该具有相同的结果。这是因为它需要一个参数。您最好说明如何调用它。该参数是可同时使用的最大子进程数您是否尝试过
valgrind