如何使用exit(0)关闭子进程

时间:2018-05-16 12:38:38

标签: c fork exit

当我运行以下代码时,有时它的工作正常,有时它会给我一个分段错误,并且它会不停地产生子进程。
如果我更换return 0; exit(0);始终有效。
有人可以解释为什么会这样吗?不应该the exit(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;
}

0 个答案:

没有答案