编程unix shell

时间:2011-09-19 17:26:40

标签: bash process pipe

我需要帮助写一个shell。我目前正在创建管道和产生相关子进程以读取和写入管道。似乎不起作用的部分是父进程和子进程之间的通信。我需要帮助。首先,如果你愿意解释一下它是如何工作的(Stdin和Stdout也是如此),我将不胜感激,并帮助我解剖一下,帮助我理解我所缺少的东西。

1 个答案:

答案 0 :(得分:0)

总体情况是:

  1. 您需要创建一个管道,例如用管子(2)。对管道的调用返回一个文件描述符,该描述符必须存储在一个变量中。
  2. 您调用fork(2),它将复制您当前的进程,包括打开的文件和文件描述符。
  3. 两个进程都使用dup2(2)重定向stdin / out。例如,dup2(pipe,STDOUT)将当前进程的stdout(但不是分叉的进程)重定向到管道中。
  4. 使用execve(2)和朋友在您刚刚设置的环境中启动其他进程。
  5. 如果您需要从子进程捕获输入,输出和错误,则需要三个管道并根据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. */
    }