【问题标题】:Programming unix shells [closed]编程 unix shell [关闭]
【发布时间】:2011-11-21 01:46:03
【问题描述】:

我需要帮助来编写一个 shell。我目前正在创建管道并生成关联的子进程以读取和写入管道。似乎不起作用的部分是父进程和子进程之间的通信。我需要这方面的帮助。首先,如果您能解释一下这是如何工作的(Stdin 和 Stdout 也是如此),我将不胜感激,并帮助我剖析我必须帮助我理解我所缺少的内容。

【问题讨论】:

  • 感谢您告诉我们,但问题是什么?
  • 您能否提供一个不起作用的示例,即您的代码部分失败。
  • C和C++与此无关。

标签: bash process pipe


【解决方案1】:

大致的图片是:

  1. 您需要创建一个管道,例如带管道(2)。对管道的调用返回一个文件描述符,该描述符必须存储在一个变量中。
  2. 您调用 fork(2),它将复制您当前的进程,包括打开的文件和文件描述符。
  3. 两个进程都使用 dup2(2) 重定向标准输入/输出。例如,dup2(pipe, STDOUT) 将当前进程(但不是分叉的!)的标准输出重定向到管道中。
  4. 使用 execve(2) 和朋友在您刚刚设置的环境中启动其他进程。

如果您需要从子进程中捕获输入、输出和错误,则需要三个管道并根据 dup2 调用:

int in,out,err,child; 
in = pipe(); out = pipe(); err = pipe();
child = fork();
if ( child == 0 ) {
    dup2( in, STDIN );
    dup2( out, STDOUT );
    dup2( err, STDERR );
    execve(something);
} else {
    /* read from out and err and write into in as necessary. */
}

【讨论】:

  • mkfifo(3) 创建一个命名管道。这不是必需的。而是使用pipe(2) 创建一个匿名管道。
  • 哦,好的,谢谢。编辑那个。
猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2015-05-05
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多