小编zar*_*ord的帖子

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

任务是使用fork和divide and conquer算法从input.dat按升序对数组进行排序.

所以我使用这个编写了一个代码,但父进程的结束速度比子进程快.我的代码中有以下行,但父母不会等他们的孩子.

while(wait(NULL)>0);
Run Code Online (Sandbox Code Playgroud)

我的代码的一点解释:

在input.dat中是一个具有以下形式的数组:

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

例:

6 2 3 1 4 5 6

所以我在数组中读取,并将其拆分为两个结构中创建的两个数组,用于扭曲到管道中.之后我调用了divitimp函数,对表单有一点解释:

(在我的代码中)divitimp(readwhilegoingdown(lefeleolvas),writewhilegoingdown(lefeleir),readwhilecomingup(felfeleolvas),writewhilecomingup(felfeleir))

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

在这些之后,我想等到子进程结束,我使用merge sort对排序的数组进行排序,然后将结果(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++){ …
Run Code Online (Sandbox Code Playgroud)

c linux fork pipeline

3
推荐指数
1
解决办法
103
查看次数

标签 统计

c ×1

fork ×1

linux ×1

pipeline ×1