Закрывающий канал, dup2, файловые дескрипторы на C? - PullRequest
1 голос
/ 02 февраля 2012

Я запускаю программу, которая делает трубопровод. Команда, которую я хочу выполнить: ls | кошка.

int cmd(char** w, int* pipe, int action){
... some code up here
...
int fd;
if(child_pid == 0) {
    if (pipe != 0) {

        if (action == 0){
            fd = dup2(pipe[0], STDIN_FILENO);
            close(pipe[0]);
            close(pipe[1]);
            //close(fd);
        }
        else if (action == 1){
            fd = dup2(pipe[1], STDOUT_FILENO);
            close(pipe[0]);
            close(pipe[1]);
            //close(fd);
        }


    }

    execvp(w[0], w);



    printf("Unknown command\n");
    exit(0);
  }
... some code down here

Когда я запускаю код, команда ls | кошка работает нормально, за исключением того, что кошка не заканчивается (то есть труба не закрывается и просто ждет там, ничего не делая). Я думаю, это потому, что я не закрыл поток или что-то еще, но я недостаточно знаком с C / IO, чтобы знать наверняка. Я правильно это делаю?

код, который запускает эту функцию, похож на

int fd[2];
int p = pipe(fd);
cmd(w, fd, 1);
cmd(w, fd, 0);

редактировать: ты прав, fatalerror, я опечатался в аргументе

thxs, похоже, мне просто нужно было закрыть трубу [1] в родительском

1 Ответ

3 голосов
/ 02 февраля 2012

Родительскому процессу также необходимо закрыть оба конца канала после двух вызовов cmd.

...