Реализация канала

Я пытаюсь реализовать оболочку Linux, которая поддерживает передачу по каналу. Я уже сделал простые команды, команды, работающие в фоне, перенаправлениях, но передача по каналу все еще отсутствует.

Я уже читал об этом и видел некоторые отрывки кода, но все еще не смог разобраться в рабочем решении.

Что я имею до сих пор:

int fd[2];

pipe(fd);

pid_t pid = fork();

if (pid == -1)  
   return -1;  

if (pid == 0)  
{  
   close(fd[1]); //close write to pipe, in child
   execlp("cat", "cat", "names.txt", NULL);
}

else
{
   close(fd[0]); //close read from pipe, in parent
   execlp("sort", "sort", NULL);
}  

Я - программист новичка, как можно, вероятно, сказать, и когда я программирую что-то, что я не знаю много о, это имеющее место, очевидно, мне нравится запускаться с чего-то действительно легкого и конкретного и затем создавать оттуда.

Так, перед способностью реализовать три и более различные команды в конвейере, я хотел бы смочь вычислить "ls names.txt | вид" или что-то подобное, в котором names.txt является файлом имен, в алфавитном порядке незаказанных.

Обновленный код, но все еще не работает.

Спасибо.

9
задан nunos 17 April 2010 в 19:51
поделиться

2 ответа

Вам необходимо замените стандартный вывод одного дочернего элемента записывающим концом канала, а стандартный поток другого дочернего элемента - концом чтения:

if (pid == 0)  
{  
   close(fd[0]); //close read from pipe, in parent
   dup2(fd[1], STDOUT_FILENO); // Replace stdout with the write end of the pipe
   close(fd[1]); // Don't need another copy of the pipe write end hanging about
   execlp("cat", "cat", "names.txt", NULL);
}
else
{
   close(fd[1]); //close write to pipe, in child
   dup2(fd[0], STDIN_FILENO); // Replace stdin with the read end of the pipe
   close(fd[0]); // Don't need another copy of the pipe read end hanging about
   execlp("sort", "sort", NULL);
} 
11
ответ дан 4 December 2019 в 13:46
поделиться

pipe () вызов стандартной библиотеки. Это используется для создания трубы. Вы, конечно, должны выполнить часть работы до и fork () , чтобы дочерний процесс правильно наследовал файловый дескриптор.

Также обратите внимание на порядок аргументов dup2 () :

int dup2(int oldfd, int newfd);

dup2 () делает newfd копией oldfd, при необходимости сначала закрывая newfd

4
ответ дан 4 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: