c - 父子进程随机结束(linux,c,fork())

标签 c linux fork pipeline

任务是使用 fork 和分而治之算法对 input.dat 中的数组进行升序排序。

所以我用这个写了一个代码,但是父进程比子进程结束得更快。我的代码中有以下行,但 parent 不会等待他们的 child 。

while(wait(NULL)>0);

对我的代码的一些解释:

在input.dat中是一个数组,形式如下:

(数组的长)(空格)(第一个数字)(空格)(第二个数字)...

例子:

6 2 3 1 4 5 6

所以我读入了数组,并将其拆分为在两个结构中创建的两个数组,以便进入管道。之后我调用了 divitimp 函数,对表格做了一些解释:

(在我的代码中) divitimp(下行时阅读(lefeleolvas),下行时写信(lefeleir),上行时阅读(felfeleolvas),上行时写信(felfeleir))

在 divitimp 函数启动后我使用 fork,如果它工作(没有错误)我看看它是子进程还是父进程(代码在 if 和 in the else 中是相同的),之后(在if ) 如果结构中的数组不长于两个元素,我从管道中读出一个结构我将排序的结构写入 writewhilecomingup 管道并且不回调 divitimp 函数,如果数组长于 2,我拆分数组到在两个结构中创建的两个数组,我将它们写入 writewhilegoingdown 管道并回调 divitimp 函数。

在这些之后,我想等到子进程结束,然后我使用合并排序对排序的数组进行排序,然后将结果(eredmeny)写入 writewhilecomingup 管道。

divitimp 函数完成后,我返回到 main 并从 readwhilegoingup 管道读取解决方案结构,并将其写入 output.dat。

问题是进程(父进程和子进程)以随机顺序结束。

源代码(很长很抱歉,但没有我的代码 无法解释问题):

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

typedef struct{
int n;
int a[100];
}TOMB;

void divitimp(int lefeleolvas, int lefeleir,int felfeleolvas,int felfeleir){
pid_t pid;
int i;
if ((pid = fork()) < 0){
    perror("fork hiba");
}
else{
    printf("pid= %i \n",pid);
    if(pid==0){
        TOMB valtozo;
        read(lefeleolvas,& valtozo, sizeof(valtozo));
        if(valtozo.n>2){
            TOMB sv,sv1;
            sv.n=valtozo.n/2;
            sv1.n=valtozo.n-valtozo.n/2;
            printf("Uj ismetles:%d ",sv.n);
            for(i=0;i<sv.n;i++){
                    sv.a[i]=valtozo.a[i];
                printf(" %d ",sv.a[i]);
            }
            int ai=sv1.n-1;
            printf(" *%d* ", sv1.n);
            for(i=0;i<sv1.n;i++){
                sv1.a[i]=valtozo.a[ai];
                ai++;
                printf(" %d ",sv1.a[i]);
            }
            printf("itt a vege\n");
            write(lefeleir,& sv,sizeof(sv));
            write(lefeleir,& sv1,sizeof(sv1));
            divitimp(lefeleolvas, lefeleir, felfeleolvas, felfeleir);
        }           
        else{
            if(valtozo.n==1){
                write(felfeleir,& valtozo,sizeof(valtozo));
            }
            else{
                if(valtozo.n==2);{
                    if(valtozo.a[0]<valtozo.a[1]){
                        write(felfeleir,& valtozo,sizeof(valtozo));
                    }
                    else{
                        int csere=valtozo.a[1];
                        valtozo.a[1]=valtozo.a[0];
                        valtozo.a[0]=csere;
                        write(felfeleir,& valtozo,sizeof(valtozo));

                    }
                }
            }
        }
    }
    else{
                    TOMB valtozo;
                    read(lefeleolvas,& valtozo, sizeof(valtozo));
                    if(valtozo.n>2){
                            TOMB sv,sv1;
                            sv.n=valtozo.n/2;
                            sv1.n=valtozo.n-valtozo.n/2;
                            printf("Uj ismetles:%d ",sv.n);
                            for(i=0;i<sv.n;i++){
                                    sv.a[i]=valtozo.a[i];
                                    printf(" %d ",sv.a[i]);
                            }
                            int ai=sv1.n-1;
            printf(" *%d* ", sv1.n);
                            for(i=0;i<sv1.n;i++){
                                    sv1.a[i]=valtozo.a[ai];
                                    ai++;
                                    printf(" %d ",sv1.a[i]);
                            }
                            printf("itt a vege\n");
                            write(lefeleir,& sv,sizeof(sv));
                            write(lefeleir,& sv1,sizeof(sv1));
                            divitimp(lefeleolvas, lefeleir, felfeleolvas, felfeleir);
            exit(0);
                    }
                    else{
                            if(valtozo.n==1){
                                    write(felfeleir,& valtozo,sizeof(valtozo));
                                    exit(0);
                            }
                            else{
                                    if(valtozo.n==2);{
                                            if(valtozo.a[0]<valtozo.a[1]){
                                                    write(felfeleir,& valtozo,sizeof(valtozo));
                                            exit(0);
                                            }
                                            else{
                                                    int csere=valtozo.a[1];
                                                    valtozo.a[1]=valtozo.a[0];
                                                    valtozo.a[0]=csere;
                                                    write(felfeleir,& valtozo,sizeof(valtozo));
                                            exit(0);
                                            }
                                    }
                            }
                    }
    }
    while(wait(NULL)>0);
    if(pid==0){
        TOMB sv,sv1,eredmeny;
        read(felfeleolvas,& sv,sizeof(sv));
        read(felfeleolvas,& sv1,sizeof(sv));
        int svi=0,sv1i=0;
        eredmeny.n=sv.n+sv1.n;
        for(i=0;i<sv.n+sv1.n;i++){
            if(svi<sv.n&&sv1i<sv1.n){
                if(sv.a[svi]<sv1.a[sv1i]){
                    eredmeny.a[i]=sv.a[svi];
                    svi++;
                }
                else{
                    eredmeny.a[i]=sv1.a[sv1i];
                    sv1i++;
                }
            }
            else{
                if(svi<sv.n){
                    eredmeny.a[i]=sv.a[svi];
                svi++;  
                }
                else{
                    eredmeny.a[i]=sv1.a[sv1i];
                    sv1i++;
                }
            }
            printf("e=%d sv=%d sv1=%d\n",eredmeny.a[i],sv.a[svi-1],sv1.a[sv1i-1]);

        }
        write(felfeleir,& eredmeny, sizeof(eredmeny));

    }
   }
 }

int main(){
    FILE *f= fopen("input.dat","r");
if(!f){
perror("nincs megfelelo allomany");
exit(1);
}
    FILE *g= fopen("output.dat","w");
int n;
fscanf(f,"%d",&n);
int a[n];
a[0]=n;
int i=0;
printf("%d",n);
for(i;i<n;i++){
fscanf(f,"%d",&a[i]);
}
//printf("%d \n",n);
TOMB betesz1, betesz2;
    betesz1.n=n/2;
    for(i=0;i<betesz1.n;i++){
    betesz1.a[i]=a[i];
printf("%d\n ",a[i]);   
}
    betesz2.n=n-n/2;
    int ai=betesz2.n;
    for(i=0;i<betesz2.n;i++){
    betesz2.a[i]=a[ai];
    ai++;
printf("%d\n ",a[ai-1]);
}
    int pfd[2];
    if (pipe(pfd) < 0){
    perror("pipe hiba");
}
    int pfd1[2];
    if (pipe(pfd1) < 0){
    perror("pipe hiba");
}
    write(pfd[1],& betesz1, sizeof(betesz1));
    write(pfd[1],& betesz2, sizeof(betesz2));

divitimp(pfd[0],pfd[1],pfd1[0],pfd1[1]);
TOMB eredmeny;
read(pfd1[0],& eredmeny,sizeof(eredmeny));
printf("%d\n",eredmeny.n);
for(i=0;i<eredmeny.n;i++){
    fprintf(g,"%d ",eredmeny.a[i]);
}
fclose(f);
fclose(g);
return 0;
}

最佳答案

我认为您混淆了父进程和子进程。 fork() 在子进程中返回 0,但在 else 分支上有 exit(0),这基本上意味着您终止了父进程。

尝试将您的 if 语句切换为 pid != 0。

关于c - 父子进程随机结束(linux,c,fork()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44008405/

相关文章:

java - 流程执行跟踪工具

c - 我的 fork() 从不等于 0

python - Sage/Python 中 fork 后出现 SIGILL

具有非阻塞管道 IO 的 C fork/exec

c - 从数组中读取数字然后将它们插入列表的程序不起作用

c - 如何查看当前用户是否有管理权限

c++ - 一元 '*' 的无效类型参数(具有 'int' )数组中的最低元素

C 修改函数参数中的字符串并取消引用

linux - 无法在 Windows 上克隆,但可以从 Gitlab 服务器在 Linux 上克隆

linux - 在 Unix 平台上从文件访问远程机器和 grep 多字符串模式