Моя цель - взять команду, которая вводится пользователем, и выполнить ее с помощью разветвленного дочернего процесса, но вместо того, чтобы дочерний процесс печатал ее на экране, сохранять выходные данные в именованном канале и иметь родительский процесс. отобразить вывод после завершения дочернего процесса.
Я пытаюсь сделать это, используя dup2 () для перенаправления стандартного вывода в именованный канал, который я создал, но дочерний процесс просто печатает выводкоманда и при попытке чтения из канала в родительском процессе я получаю следующую ошибку:
Ошибка чтения из канала: неверный дескриптор файла
У меня естьискал похожие вопросы на этом сайте, но нашел только решения для использования обычных каналов для хранения результатов exec (), и я не смог адаптировать эти решения для именованных каналов. Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define CMDSIZE 50
#define BUFSIZE 5000
int main() {
char cmd[CMDSIZE], arg[CMDSIZE], buf[BUFSIZE];
int fd, n;
pid_t pid = fork();
if (pid < 0) {
perror("Error creating process");
return 1;
}
else if (pid == 0) {
printf("SHELL > ");
fgets(buf, BUFSIZE, stdin);
sscanf(buf, "%s %s", cmd, arg);
memset(buf, 0, BUFSIZE);
printf("Working on request...\n");
unlink("cmdpipe");
mkfifo("cmdpipe", 0777);
fd = open("cmdpipe", 0777);
dup2(fd, STDOUT_FILENO);
close(fd);
if (arg[0] == '\0')
execlp(cmd, cmd, NULL);
else
execlp(cmd, cmd, arg, NULL);
}
else {
wait(NULL);
printf("...Output ready! Displaying now.\n");
fd = open("cmdpipe", 0777);
if ((n = read(fd, buf, BUFSIZE)) < 0) {
perror("Error reading from pipe");
return n;
}
close(fd);
printf("%s\n", buf);
}
return 0;
}
Спасибо.