c - fork() 后子进程的独立 I/O

标签 c linux operating-system posix

我正在尝试使用 C 在 Linux 上实现一个应用程序,并且我有一个要求,我需要在我的子进程和父进程上单独执行 I/O。这就是我正在寻找的内容

  1. 用户运行应用程序,父进程生成 3 个子进程。
  2. 每个子进程都会生成一个等待用户输入的线程。
  3. 应该有一种直观的方法,用户可以通过该方法指定他正在与哪个子进程交互。

理想情况下,我希望每个子进程都在不同的终端上执行,这样对于正在与之交互的用户来说非常清楚。

我在Executing child process in new terminal看到了类似的问题,但对于所涉及的步骤,答案不是很清楚。似乎表明可以通过像这样的xterm -e sh -c执行xterm来完成,但尚未得到证实。我还想在父<-->子进程和子<-->子进程之间设置一些IPC,所以如果我通过执行xterm在新终端中启动子进程,它是我父进程的子进程?是 xterm 吗?如果是这样,我实际上想要在子进程中执行的代码,它会作为 xterm 的子进程执行吗?

最佳答案

假设您已经生成了三个子进程,并且您在 tty1 上运行父进程。

  • tty1:现在包含所有诊断信息
  • tty2:子进程1
  • tty3:子进程2
  • tty4:子进程3
  • tty5:用户输入

因此每个子进程都会从其 tty 中读取数据,就好像它是一个文件一样(注意:需要 root 权限)。例如,要向子进程 2 提供输入,请转到 tty5 并输入以下命令: cat->/dev/tty3

然后将输入键入到程序中,然后按 Ctrl-D。您的子进程 2 现在应该收到该输入。

编辑您不需要在不同的 tty 上实际运行子进程。只需要使用 root 权限运行它们,然后从这些 tty 数字中读取和写入,就像从 stdin 读取并写入 stdout 一样。抱歉造成困惑。

关于c - fork() 后子进程的独立 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897514/

相关文章:

operating-system - 页表如何处理堆栈和堆内存地址?

c - 为什么在这个char数组中加入一个int,并没有加入相同值的ASCII字符呢?

c - (char *) x 或 (void *) z 是什么意思?

c - 在 linux 中修改目标文件函数 xref 的优雅方式

linux - Cocoa = 如何在不启动 C 终端的情况下在后台运行脚本

c - 用于打印 “stat”缓冲区内容的格式说明符

将 Int 转换为指示 C 中位位置的 Int 数组

linux - 让 bash 脚本在 'interactive mode' 提示符下输入数字

linux - 仅为我自己禁用和重新启用地址空间布局随机化

C++ 内存管理和虚拟内存页面大小