Ubuntu 在 C 语言中的 shell 处理中的特定管道命令



我正在尝试模拟Ubuntu终端上的管道行为,例如命令:
"回声你好| wc"。
请假设我从stdin那里获得了令牌,正确处理所有内容,现在这些是我从用户中"收到"的命令,这些命令将它们在外壳中输入以供我处理。
我正在尝试创建两个过程。在第一个过程中,我使用管道将管道编写边缘的文件描述符指向Stdout。第二个过程应在管道的阅读边缘读取到stdin中这是我写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
  char* fcmd[] = {"echo", "hello", NULL};
  char* scmd[] = {"wc", NULL};
  pid_t pid;
  int pipe_des[2];
  int i;
  pipe(pipe_des);
  for(i = 0; i < 2; i++)
  {
      pid = fork(); 
      if (pid ==0)
      {
          switch (i)
          {
              case 0: // FIRST CHILD
              {
                  dup2(pipe_des[1], STDOUT_FILENO);
                  close(pipe_des[0]);
                  execvp(fcmd[0], fcmd);
                  exit(0);
              }
              case 1: //SECOND CHILD
              {
                  dup2(pipe_des[0], STDIN_FILENO);
                  close(pipe_des[1]);
                  execvp(scmd[0], scmd);
                  exit(0);
              }
            }
        }
        else if (pid < 0)
            exit(EXIT_FAILURE);
return EXIT_SUCCESS;
}

我得到:" amirla@ubuntu:~/Desktop/os/class/ex4$ 1 1 6"
喜欢它,但是为什么他首先要打印Bash CWD?该管道似乎起作用,因为我会根据我使用回声命令发送的单词的长度(在Main()中)得到了我应该得到的。之后,光标只是在下面的线上等待另一个命令,而没有向我展示Bash PWD。(也许Stdin正在等待?)
我在这里以及其他网站上都查看了许多帖子,但我似乎仍然找不到解决问题的解决方案。任何帮助,将不胜感激。提前致谢。注意:请忽略检查错误,我已将其删除以使代码较短,因此假设它们存在。

为什么在输出之前得到提示?

您的主要过程不会等待孩子们完成。您看到的是:

  1. 主要开始
  2. 主要创造孩子
  3. 主退出
  4. bash打印提示
  5. 孩子们开始工作

要防止这种情况,您需要等待孩子们。查看如何等到fork()完成的所有子进程?

在您的情况下,足以添加

 waitpid(-1, NULL, 0);

循环后。

相关内容

  • 没有找到相关文章

最新更新