Как реализовать Bash, чтобы можно было выполнить команду «cat | ls»? [дубликат]Linux

Ответить
Anonymous
 Как реализовать Bash, чтобы можно было выполнить команду «cat | ls»? [дубликат]

Сообщение Anonymous »

Я пытался разработать мини-оболочку на языке C, которая в основном действует как Bash. Однако у меня возникла проблема с выполнением этой команды: cat | лс. В моей программе, когда я выполняю эту команду, она ожидает ввода от стандартного ввода и печатает вывод команды ls только тогда, когда cat достигает EOF, который происходит только тогда, когда я отправляю программе сигнал ctrl+D. С другой стороны, в Bash, когда я выполняю cat | ls, она сначала выводит вывод команды ls на стандартный вывод, ожидает ввода со стандартного ввода и прекращает выполнение всей команды после ввода одной строки ввода в стандартный ввод.
Я создал минимальный воспроизводимый пример своей программы, и он работает точно так же.

Код: Выделить всё

#include 
#include 
#include 

void execute_block(char **block)
{
int pid;

pid = fork();
if (pid == -1)
exit(EXIT_FAILURE);
if (pid == 0)
{
if (execve(block[0], block, NULL) == -1)
{
perror(block[0]);
exit(127);
}
exit(EXIT_SUCCESS);
}
waitpid(pid, NULL, 0);
}

void handle_commands(char **block1, char **block2)
{
int pid;
int pipefd[2];

if (pipe(pipefd) == -1)
exit(EXIT_FAILURE);
pid = fork();
if (pid == -1)
exit(EXIT_FAILURE);
if (pid == 0)
{
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
close(pipefd[1]);
execute_block(block1);
exit(EXIT_SUCCESS);
}
close(pipefd[1]);
dup2(pipefd[0], STDIN_FILENO);
close(pipefd[0]);
waitpid(pid, NULL, 0);
execute_block(block2);
}

int main(int argc, char **argv, char **envp)
{
char *block1[] = {"/bin/cat", NULL};
char *block2[] = {"/bin/ls", NULL};

handle_commands(block1, block2);
}
Почему моя программа не работает так же, как Bash. Связано ли это с тем, как я обращаюсь с трубами? Или что-то еще? Также может ли эта проблема возникнуть из-за того, как я использую функции waitpid()?

Подробнее здесь: https://stackoverflow.com/questions/781 ... ls-command
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»