Я пытаюсь реализовать оболочку 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 является файлом имен, в алфавитном порядке незаказанных.
Обновленный код, но все еще не работает.
Спасибо.
Вам необходимо замените стандартный вывод одного дочернего элемента записывающим концом канала, а стандартный поток другого дочернего элемента - концом чтения:
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);
}
pipe ()
вызов стандартной библиотеки. Это используется для создания трубы. Вы, конечно, должны выполнить часть работы до и fork ()
, чтобы дочерний процесс правильно наследовал файловый дескриптор.
Также обратите внимание на порядок аргументов dup2 ()
:
int dup2(int oldfd, int newfd);
dup2 () делает newfd копией oldfd, при необходимости сначала закрывая newfd