【问题标题】:Not getting back terminal prompt after fork-exec-dupfork-exec-dup 后没有返回终端提示
【发布时间】:2011-10-08 00:09:08
【问题描述】:

我有一段代码是这样的:

pipe(fd);
child_map[0] = fd[0];
child_map[1] = fileno(stdout)
child_map[2] = fileno(stderr);

pid = fork();

if (child_process)
    dup(child_map[0], STDIN_FILENO)
    dup(child_map[0], STDOUT_FILENO)
    dup(child_map[0], STDERR_FILENO)
    execvp(argv[0], argv)  /* child process can be either "grep" or "more" etc */
else if parent_process
    return;

我的问题是,在我将输出重定向到 grep/more(可以是子进程)后,我无法恢复终端提示。不过,命令 o/p 在终端上打印得很好。但是我没有得到提示,我可以看到“更多”或“grep”进程正在后台运行。我需要输入 ctrl+C 才能获得提示。我知道这与文件描述符未关闭等有关,但我不知道如何解决这个问题。

这实际上是在另一个进程上下文中完成的。而且我可以看到父进程仍在运行。除非我终止它,否则它不会终止。所以没有任何关于孩子成为孤儿的问题。 [摘自 Vin 的评论,澄清价值值得怀疑 -msw]

【问题讨论】:

  • 你应该先接受一个问题

标签: c linux exec fork


【解决方案1】:

问题在于未正确关闭已打开的文件描述符。有些必须关闭,我没有这样做。所以这个过程过去一直在等待输入。

【讨论】:

  • 这也是一个很好的资源:@​​987654321@
【解决方案2】:

父进程应该等待子进程完成。

【讨论】:

  • 父进程是将输入提供给 more/grep 的进程。所以如果父进程一直在等待子进程结束,那是没有用的。
  • 父级应该一直输入输入直到没有更多,然后关闭输入文件描述符并使用等待(3p)直到子级退出。
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2013-03-01
  • 2012-11-17
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多