Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在编写Linux shell时管理stdout/stdin_C_Linux_Bash_Shell - Fatal编程技术网

C 在编写Linux shell时管理stdout/stdin

C 在编写Linux shell时管理stdout/stdin,c,linux,bash,shell,C,Linux,Bash,Shell,我正在做一个学校项目,虽然它不是必需的,但我想实现这个功能。话虽如此,我无法共享代码,但我认为这与本例无关 使用fork()时,我的理解是创建的子进程继承stdin和stdout,因为子进程继承父进程的所有文件流 我的shell需要后台功能,虽然从技术上讲它已经具备了后台功能,但如果“后台”程序运行,它仍然会从stdin接收所有数据,并继续输出到屏幕上,这只是一团混乱。作为记录,我的讲师编译的示例shell也做了同样的事情,但我不希望发生这种情况 我很确定我应该使用pipe()、fork()和d

我正在做一个学校项目,虽然它不是必需的,但我想实现这个功能。话虽如此,我无法共享代码,但我认为这与本例无关

使用fork()时,我的理解是创建的子进程继承stdin和stdout,因为子进程继承父进程的所有文件流

我的shell需要后台功能,虽然从技术上讲它已经具备了后台功能,但如果“后台”程序运行,它仍然会从stdin接收所有数据,并继续输出到屏幕上,这只是一团混乱。作为记录,我的讲师编译的示例shell也做了同样的事情,但我不希望发生这种情况

我很确定我应该使用pipe()、fork()和dup2()的组合,但我不能把它们全部放在一起。我理解fork,但我不理解pipe或dup2是如何工作的,以及我应该如何在shell中实现它。我的想法是这样的:

thePipe[2] = pipe();
pid = fork();
close stdin/out on child somehow if backgrounded
但是我不理解pipe()或dup2()的功能,所以我被卡住了


谢谢

这里不需要管道。在交互式shell中运行的进程应该与shell共享它们的标准文件描述符——否则会破坏更多的东西(包括子进程确定它们以交互方式运行的能力,以及与tty交互以处理窗口大小更改等事情的能力)。这也会使管道严重复杂化。不要这样做

这里缺少的是进程组,这在开放组UNIX规范的一节中进行了描述。简而言之,内核可以显式地识别终端的“前台进程组”。如果不在此组中的进程尝试读取或写入终端,则会自动停止


GNULIBC手册的一部分提供了制作一个正常运行的shell所必需的内容的简要介绍,请参见。尝试按照他们的说明进行操作,看看如何进行。

如果我理解正确,您可能希望对终端(termcap或terminfo?)执行一些操作,如果可能,请告诉它生成SigtIn和/或SIGTTOU。我已经有一段时间没有研究这个问题了,所以很遗憾我不能提供一个实际的答案;它很好地解释了如何使用-sShells总是以这种方式工作,后台进程继续向stdin和stdout写入数据,就像前台进程一样。在一个壳中,全面禁止这种行为是不可取的。您需要的是(1)一个不写入任何标准流的程序;或(2)在运行后台程序时重定向其标准流。请参阅man 2 pipe和man 2 dup,以更好地了解未命名pipe和dup。如果你想了解命名管道,那么你也可以参考man 2 mknod。非常感谢。这是另一件我没有时间跟进的事情,因为项目已经完成,现在我们已经分配了另一件。我会在不久的将来修改我们的shell。现在项目已经完成,截止日期已经过去,我已经公开了代码: