2011-07-18 30 views
1

后我有一些一段代码,其是这样的:未取回终端提示叉EXEC-DUP

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 /以上(其可以是子进程),我无法获取终端提示符。虽然命令o/p在终端上打印得很好。但我没有回到提示,我可以看到“更多”或“grep”进程在后台运行。我需要输入ctrl + C来获得提示。我知道它与文件描述符没有关闭等有关,但我不知道如何解决这个问题。

这实际上是从另一个过程上下文来完成的。我可以看到父进程仍在运行。除非我终止它,否则它不会终止。所以,这个孩子没有孤儿的问题。 [从Vin的评论中解释,澄清值是值得怀疑的-msw]

+0

有人可以帮忙吗? – Vin

+0

您应该首先接受问题 –

回答

0

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

+0

这也是一个很好的资源:http://stackoverflow.com/questions/916900/having-trouble-with-fork-pipe-dup2-and-exec-in-c – Vin

0

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

+0

父进程是将输入提供给more/grep的进程。因此,如果父母一直等待子进程结束,那么没有用处。 – Vin

+0

父应该提供输入直到没有更多,然后关闭输入文件描述符并使用wait(3p),直到孩子退出。 – Antti