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
?