【问题标题】:Bash prompt appearing in middle of the outputBash 提示出现在输出中间
【发布时间】:2019-01-07 14:28:44
【问题描述】:

我正在解决 Ubuntu 16.04 中 C 中的 fork() 和 pipe() 的问题,输出应该是 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;

}

This is the output

【问题讨论】:

  • 这是很常见的行为。你的程序启动,创建一个孩子,做一些事情,然后退出。然后 shell 打印提示。然后孩子打印一些数据。为防止这种情况,您的进程应在子进程退出之前为子进程wait
  • 您的pipe 电话在哪里?
  • @WilliamPursell 我已经编辑了代码。请看。谢谢。

标签: linux terminal pipe fork ubuntu-16.04


【解决方案1】:

您的程序正在创建子进程,但它并没有等待它们完成就允许自己退出。这意味着它们会继续工作,即使在您的初始过程结束并且您的 shell 继续运行并打印提示符之后。

这可以通过在初始进程中使用您创建的子进程的 pid 调用 wait(2) 来解决。

【讨论】:

  • 对不起,我是 fork() 和 wait() 的新手。 wait() 和 waitpid() 函数中的争论 &status 到底是什么意思?如果您能指出它在这种情况下的价值,那也会有所帮助。谢谢。
  • 我能理解的是,我必须在初始进程中放置一个 waitpid(q, &status, 1) (其中 q 是最后一个孩子的 pid),但它的状态是什么争论?
  • status 参数是一个指向整数的指针,您正在等待的进程的状态将存储在该整数中。从手册页:“如果状态不为 NULL,wait() 和 waitpid() 将状态信息存储在它指向的 int 中。”
  • 哦,明白了。我误解了什么是状态,我的错。谢谢!
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2013-12-05
相关资源
最近更新 更多