Приглашение Bash появляется в середине вывода - PullRequest
0 голосов
/ 07 января 2019

Я работал над проблемой в fork () и pipe () в C в Ubuntu 16.04, и вывод должен быть отсортированным массивом из 150 целых чисел. Вывод по желанию, однако, приглашение bash появляется в середине вывода. Его положение случайное каждый раз. Я нигде не нашел упоминаний об этом виде происшествия. Я не знаю, если это из-за моего кода или что-то еще. Подскажите пожалуйста причину? Это мой код bubbleSort - это обычная функция сортировки пузырьков.

int main(){
int pd1[2], pd2[2], pd3[2], pd4[2], j=0;
int p, ABC[50],D1[50],D2[50], i,D[100], E[150];


if(pipe(pd1)<0){
    printf("Pipe1 creation failed!!...\nExiting...");
    exit(1);
}
if(pipe(pd2)<0){
    printf("Pipe2 creation failed!!...\nExiting...");
    exit(1);
}
if(pipe(pd3)<0){
    printf("Pipe3 creation failed!!...\nExiting...");
    exit(1);
}
if(pipe(pd4)<0){
    printf("Pipe4 creation failed!!...\nExiting...");
    exit(1);
}

p=fork();
if(p<0){
    printf("Fork creation failed!!...\nExiting...");
    exit(1);
}



srand(time(NULL)+p);
for(i=0;i<50;i++){
    ABC[i]=rand()%1000;
}
bubbleSort(ABC,50);
if(!p)
    write(pd1[1],ABC,sizeof(ABC)+1);
else{
    write(pd2[1],ABC,sizeof(ABC)+1);
    if(fork()==0){
        for(i=0;i<50;i++)
            ABC[i]=rand()%1000;
        bubbleSort(ABC,50);
        write(pd3[1],ABC,50);
        if(fork()==0){
            read(pd1[0],D1,sizeof(D1));
            read(pd2[0],D2,sizeof(D2));
            //close(pd1[0]); close(pd1[1]); close(pd2[0]); close(pd2[1]);
            for(i=0;i<50;i++){
                D[i]=D1[i];
                D[i+50]=D2[i];
            }
            bubbleSort(D,100);
            write(pd4[1],D,sizeof(D)+1);
            if(fork()==0){
                read(pd3[0],ABC,sizeof(ABC));
                read(pd4[0],D,sizeof(D));
                //close(pd3[0]); close(pd3[1]); close(pd4[0]); close(pd4[1]);
                for(i=0;i<100;i++)
                    E[i]=D[i];
                for(i=0;i<50;i++)
                    E[i+100]=ABC[i];
                bubbleSort(E,150);
                for(int i=0;i<150;i++)
                    printf("%d %d\n",i,E[i]);       
            }
        }

    }
}
return 0;

}

Это вывод

1 Ответ

0 голосов
/ 07 января 2019

Ваша программа создает дочерние процессы, но она не ожидает их завершения, прежде чем позволить себе завершиться. Это означает, что они продолжают выполнять работу, даже после того, как ваш первоначальный процесс завершился, и ваша оболочка переходит и печатает приглашение.

Это можно исправить, вызвав wait(2) из вашего начального процесса с pid дочерних процессов, которые вы создаете.

...