execve / bin / bash как дочерний процесс. взаимодействовать с Bash через родительский процесс с использованием каналов - PullRequest
0 голосов
/ 08 мая 2018

Я хочу выполнить bash как дочерний процесс в программе переменного тока.По сути, bash должен контролироваться родительским процессом: родительский процесс читает из stdin, сохраняет входные данные для чтения в буфер и записывает содержимое буфера в bash через канал.Предполагается, что выходные данные bash будут переданы через другой канал обратно в стандартный вывод родительского процесса.Например: родительский процесс читает «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, нажимаю ввод, ничего не происходит, снова нажимаю ввод, вывод.

$ ./pipe
ls

bash: line 3: s: command not found

Почему только символдоставлен на баш?

...