[英]Parent and child process end randomly (linux, c, fork())
任務是使用fork和divide and conquer算法從input.dat按升序對數組進行排序。
所以我使用這個編寫了一個代碼,但父進程的結束速度比子進程快。 我的代碼中有以下行,但父母不會等他們的孩子。
while(wait(NULL)>0);
我的代碼的一點解釋:
在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++){
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.