【发布时间】:2014-09-08 03:21:04
【问题描述】:
我正在做一个学校项目,虽然不是必需的,但我想实现这个功能。话虽如此,我无法共享代码,但我认为在这种情况下这无关紧要。
在使用fork()时,我的理解是创建的子进程继承了stdin和stdout,因为子进程继承了父进程的所有文件流。
我的 shell 需要后台功能,虽然它在技术上已经具备,但如果“后台”程序运行,它仍然会从标准输入接收所有数据并继续输出到屏幕,这只是一团糟。作为记录,我的讲师编译的示例 shell 做了同样的事情,但我不希望这种情况发生!
我很确定我应该使用 pipe()、fork() 和 dup2() 的组合,但我不能把它们放在一起。我了解 fork,但我不了解 pipe 或 dup2 的工作原理以及我应该如何在 shell 中实现它。我在想一些事情:
thePipe[2] = pipe();
pid = fork();
close stdin/out on child somehow if backgrounded
但我不明白 pipe() 或 dup2() 的功能,所以我被卡住了。
谢谢!
【问题讨论】:
-
如果我的理解正确,您可能会想对终端(termcap 或 terminfo?)做一些事情,如果可能的话,告诉它生成 SIGTTIN 和/或 SIGTTOU job control signals。自从我研究这个以来已经有一段时间了,所以很遗憾我无法提供实际的答案。
-
阅读Advanced Linux Programming;它很好地解释了如何使用pipe(7)-s
-
Shell 总是以这种方式工作,后台进程继续写入标准输入和标准输出,就像前台进程一样。全面抑制这种情况在外壳中不是可取的行为。您想要的是(1)一个不写入任何标准流的程序;或 (2) 在运行时重定向后台程序的标准流。
-
请参阅 man 2 pipe 和 man 2 dup 以更好地了解未命名的管道和 dup。如果你想了解命名管道那么你也可以参考man 2 mknod。