Используя Pipe в C, да |голова идет в бесконечном цикле - PullRequest
0 голосов
/ 23 марта 2019

После этого вопроса и ответа

Соединение n команд с трубами в оболочке?

Я пытался выполнить yes | head, но он работает в бесконечном цикле илиэто никогда не отвечает назад.В чем проблема.

Я сделал некоторые изменения, и вот бегущий код

#include <unistd.h>

struct command
{
    const char **string;
};

Вспомогательная функция

pid_t start(command* command, pid_t pid, int* status, int in, int out) {
    (void) pid;
    pid_t cpid;
    int childInt;

    cpid = fork();
    if (cpid == 0) {

        if (in != 0)
        {
            dup2(in, 0);
            close(in);
        }


        if (out != 1)
        {
            dup2(out, 1);
            close(out);
        }

            execvp(c->string[0], c->string);
            _exit(1);
        }

        waitpid(cpid, &childInt, 0);
    }


    *status = childInt;
    return c->pid;
}

и в моей основной функции

for(int i = 0; i < n; i++)
    //New command every loop
    int p = pipe(fd);
    if (p == 0)
    {
        start_command(c, 0, &status, in, fd[1]);
        close(fd[1]);
        in = fd[0];
    }
    continue;
}
dup2(in, 0);

1 Ответ

4 голосов
/ 24 марта 2019

Если вы хотите выполнить yes | head, вам нужно создать два процесса, yes и head, и вам нужно соединить их с конвейером. У вас нет кода для этого, вы просто выполняете yes и передаете его | head. Это заставляет yes выводить "| head" снова и снова.

Вы не можете просто передать yes и | head на execvp. Вы можете execvp оболочку и передать ее yes | head, поскольку оболочки имеют необходимый код для создания конвейеров, порождают несколько процессов и подключают их соответствующим образом.

...