繁体   English   中英

编写Linux Shell时管理stdout / stdin

[英]Managing stdout/stdin when writing a Linux shell

我正在做一个学校项目,尽管不是必需的,但我想实现此功能。 话虽如此,我不能共享代码,但在这种情况下,我认为这无关紧要。

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

我的shell需要后台功能,尽管从技术上讲它已经具备了该功能,但是如果运行“后台”程序,它仍然会接收来自stdin的所有数据,并继续输出到屏幕上,这简直是一团糟。 作为记录,我的讲师的编译后的示例外壳执行了相同的操作,但是我不希望发生这种情况!

我很确定我应该使用pipe(),fork()和dup2()的组合,但是我不能将它们全部放在一起。 我了解fork,但不了解pipe或dup2的工作方式以及应如何在shell中实现它。 我正在按照以下思路思考:

thePipe[2] = pipe();
pid = fork();
close stdin/out on child somehow if backgrounded

但是我不了解pipe()或dup2()的功能,所以我陷入了困境。

谢谢!

你不要在这里管。 在交互式外壳程序中运行的进程应与外壳程序共享其标准文件描述符-否则将破坏很多事情(包括子进程确定它们正在交互运行以及与tty交互以处理诸如window之类的功能的能力)大小变化)。 这也会使管道复杂化。 不要这样

这里缺少的部分是进程组 ,在Open Group UNIX规范的“常规终端接口”部分中进行了描述。 简而言之,可以使内核显式地识别终端的“前台进程组”。 如果不在该组中的进程尝试从终端读取或写入终端,则会自动停止。

GNU libc手册的“实现作业控制Shell”下提供了有关使Shell正常运行所必需的内容的简要演练。 尝试按照他们的说明进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM