我正在开展一个学校项目,虽然不是必需的,但我想实现这个功能。话虽如此,我不能共享代码,但我认为在这种情况下它是无关紧要的。
使用fork()时,我的理解是创建的子进程继承了stdin和stdout,因为子进程继承了父进程的所有文件流。
我的shell需要后台功能,虽然它在技术上已经有了,但如果“后台”程序运行,它仍会从stdin接收所有数据并继续输出到屏幕,这只是乱七八糟的混乱。为了记录,我的教师编译的示例shell做了同样的事情,但我不希望这发生!
我很确定我应该使用pipe(),fork()和dup2()的组合,但我不能把它们放在一起。我理解fork,但我不明白管道或dup2如何工作以及我应该如何在shell中实现它。我正在考虑这些问题:
thePipe[2] = pipe();
pid = fork();
close stdin/out on child somehow if backgrounded
但我不明白pipe()或dup2()的功能,所以我卡住了。
谢谢!
答案 0 :(得分:2)
你不想要管道。在交互式shell中运行的进程应该与shell共享它们的标准文件描述符 - 否则会破坏更多的东西(包括子进程确定它们以交互方式运行的能力,以及与tty交互来处理像窗口这样的事情尺寸变化)。它也使管道严重复杂化。不要这样做。
这里缺少的部分是进程组,它们在Open Group UNIX规范的"General Terminal Interface"部分中描述。简而言之,可以使内核明确地识别终端的“前台进程组”。如果不在此组中的进程尝试读取或写入终端,则会自动停止。
在"Implementing a Job Control Shell"下的GNU libc手册中,提供了制作正常运行的shell所需的简要介绍。尝试按照他们的指示,看看情况如何。