当我运行以下代码时,有时它的工作正常,有时它会给我一个分段错误,并且它会不停地产生子进程。
如果我更换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;
}