新的终端提示后,连接到stdio的管道将输出打印内容

时间:2018-11-19 06:55:32

标签: c pipe stdio

我在理解如何在C语言中进行基本管道操作时遇到了麻烦。我看了关于此主题的其他几个问题,它们要么是针对细微不同的问题,要么是我在这个主题上远远超出了我的预期不明白为什么答案对我的问题有好处。

下面的程序只是我做的一个简单测试,我试图获得与在shell中键入“ ls | grep a”等效的行为。 (我有一个作业作业,必须建造一个可以处理管道的外壳,但这是我了解管道甚至尝试作业的第一步)。我得到正确的输出,但是终端提示最终出现在输出之前,使它看起来好像没有正确终止。由于这与外壳作业有关,因此我担心这会影响成绩(无论如何让它看起来像是错误的)。有什么建议吗?

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

int main()
{
    int fdpipe[2];


    pipe(fdpipe);
    int f1 = fork();
    if(f1 == 0)
    {
        close(fdpipe[1]);
        dup2(fdpipe[0],0);
        close(fdpipe[0]);
        execlp("/bin/grep","grep","a",NULL);
    }
    else
    {
        close(fdpipe[0]);
        dup2(fdpipe[1],1);
        close(fdpipe[1]);
        execlp("/bin/ls","ls",NULL);
        wait(NULL);
    }
    return 0;
}

这是我的终端输出示例。

1067: ls
a.out  test.c  test.cc
NathanE: ~/Desktop/playground
1068: ./a.out 
NathanE: ~/Desktop/playground
1069: a.out
(The beginning of this line is where my cursor is)

我期望的是:

1067: ls
a.out  test.c  test.cc
NathanE: ~/Desktop/playground
1068: ./a.out 
a.out
NathanE: ~/Desktop/playground
1069: (my cursor would go here)

1 个答案:

答案 0 :(得分:4)

子进程运行<EditText android:inputType="textNoSuggestions|textVisiblePassword" /> myEditText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); ,而父进程将其自身替换为grepls什么也不做,因为成功的wait(NULL)再也不会返回。

由于控件在exec*()完成后立即返回到Shell,因此Shell可以在ls完成之前显示下一个提示符。

有两种方法可以避免这种情况:

  1. grep都是两个子进程,它们分别是fork()

  2. 将过程本身替换为管道链中的最后一个过程

任何一种都将确保仅在管道链中的最后一个过程完成后,控制权才返回给外壳。