execve / bin / bash作为子进程。使用管道通过父进程与bash交互

时间:2018-05-07 21:22:19

标签: c bash pipe execve

我想在c程序中将bash作为子进程执行。 bash本质上应该由父进程控制:父进程从stdin读取,将读取的输入存储到缓冲区中,并通过管道将缓冲区的内容写入bash。 bash的输出应该通过另一个管道传递回父进程的stdout。例如:父进程读取“ls”并通过管道将其提供给bash,并通过另一个管道接收bash的输出。我知道这个程序没有意义,因为有更好的方法代表父进程执行ls(或其他程序)。我实际上只是想了解管道是如何工作的,这是我想到的第一个程序。我无法使这个程序工作。这就是我到目前为止所做的:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>

int main() {
    int pc[2];//"parent to child"-pipe                                                                     
    int cp[2];//"child to parent"-pipe                                                                     
    int status;
    char buffer[256];
    char eof = EOF;

    if (pipe(pc) < 0 || pipe(cp) < 0) {
        printf("ERROR: Pipes could not be created\n");
        return -1;
    }

    pid_t child_pid = fork();

    if (child_pid == 0) { //child has pid 0, child enters here                                             
        close(pc[1]);//close write end of pc                                                                 
        close(cp[0]);//close read end of cp                                                                  

        //redirecting file descriptors to stdin/stdout                                                       
        dup2(cp[1], STDOUT_FILENO);
        dup2(pc[0], STDIN_FILENO);

        execve("/bin/bash",NULL,NULL);

    } else {//parent enters here                                                                           
        close(cp[1]);//close write end of cp                                                                 
        close(pc[0]);//close read end of pc                                                                  

        //redirecting file descriptors to stdin/stdout                                                       
        dup2(cp[0], STDOUT_FILENO);

        while(1) {
            read(STDIN_FILENO, buffer, 3);
            write(pc[1], buffer, 3);
        }

        waitpid(child_pid, &status, 0);

    }

    return 0;
}

执行时:我输入ls,按Enter键,没有任何反应,再次输入,输出。

$ ./pipe
ls

bash: line 3: s: command not found

为什么只有角色'被传递给bash?

0 个答案:

没有答案