#c #linux #sockets #unix #less-unix
Вопрос:
Программа сначала создает канал, а затем создает дочерний процесс текущего процесса fork()
.
Затем каждый процесс закрывает файловые дескрипторы, которые не нужны для каналов чтения и записи.
Дочерний процесс выполняет ls -a
команду по текущему пути и записывает выходные данные выполнения команды в канал, копируя дескриптор записи fd[1]
канала в стандартный вывод; родительский процесс считывает данные канала и отображает их fd[0]
.
Каждый процесс в Linux снабжен тремя стандартными файловыми дескрипторами, включая стандартные файлы ввода, вывода и ошибок.
По умолчанию:
- Стандартный ввод-это клавиатура, абстрагированная в виде файла, чтобы упростить написание сценариев оболочки.
- Стандартный вывод-это окно оболочки или терминал, из которого запускается скрипт, абстрагированный в виде файла, чтобы снова упростить написание сценариев и программ
- Стандартная ошибка совпадает со стандартным выводом: окно оболочки или терминал, из которого запускается скрипт.
Файловый дескриптор-это просто число, указывающее на открытый файл. По умолчанию файловый дескриптор 0 (ноль) относится к стандартным входным данным и часто сокращается как стандартный ввод данных.
Файловый дескриптор 1 относится к стандартному выходу (stdout), а файловый дескриптор 2 относится к стандартной ошибке (stderr).
Вы можете использовать dup(2)
функцию для дублирования дескриптора файла с дескриптором записи fd[1]
канала с помощью функции dup2
, чтобы переместить стандартный вывод
Вопрос в том, как я могу выполнить команду, и после этого я прочитаю stdout
в дочернем процессе.
Я выполняю его с помощью exec
функции, строка после функции exec не будет выполняться, потому что теперь образ памяти дочернего процесса ls -l
.
#include lt;sys/types.hgt; #include lt;stdio.hgt; #include lt;string.hgt; #include lt;unistd.hgt; #define BUFFER_SIZE 25 #define READ_END 0 #define WRITE_END 1 int main(void) { char writemsg[BUFFER_SIZE] = "Greetings!"; char readmsg[BUFFER_SIZE]; int fd[2]; pid_t pid; /* create the pipe */ if (pipe(fd) == -1) { fprintf(stderr,"Pipe failed"); return 1; } /* fork a child process */ pid = fork(); if (pid lt; 0) { /* error occurred */ fprintf(stderr, "Fork Failed"); return 1; } if (pid gt; 0) { /* parent process */ /* close the unused end of the pipe */ close(fd[READ_END]); /* write to the pipe */ write(fd[WRITE_END], writemsg, strlen(writemsg) 1); /* close the write end of the pipe */ close(fd[WRITE_END]); } else { /* child process */ /* close the unused end of the pipe */ close(fd[WRITE_END]); /* read from the pipe */ read(fd[READ_END], readmsg, BUFFER_SIZE); printf("read %sn",readmsg); /* close the write end of the pipe */ close(fd[READ_END]); } return 0; }
этот код работает нормально. это простой код трубопроводной связи. пожалуйста, помогите мне решить часть выполнения команды и записать ее в дочерний файл из консоли
Комментарии:
1. В Интернете есть почти бесконечное количество примеров и руководств о том, как это сделать. Не говоря уже о множестве хороших книг. Вы хотя бы пытались прочитать страницы руководства по функциям, упомянутым в задании (особенно
dup2
)?2. 1/ В вашем текущем коде родитель отправляет сообщение своему ребенку, в то время как ваше требование заключается в том, чтобы ребенок отправлял сообщение своему родителю, поэтому в настоящее время вы используете канал в неправильном направлении. 2/ вы должны закрыть неиспользуемый конец и перенаправить стандартный вывод перед вызовом exec. Канал будет автоматически закрыт, когда
ls
команда завершится.3. если вы знаете такие сайты или учебник, я, безусловно, воспользуюсь его помощью. Я пробовал их, но не смог найти никакого решения