Я только начал работать с UNIX FIFO, и я кое-что обнаружил, экспериментируя с моей первой программой FIFO. Программа работает следующим образом: после создания FIFO запускаются два процесса с использованием функции fork()
. Детский процесс читает то, что отец передает ему через FIFO, и печатает его на экране. Обмен данными - это строка, указанная в качестве аргумента. Вопрос: в разделе «Отец», если я забуду закрыть входную часть FIFO (это означает, что я исключаю строку close(fd)
), программа просто зависает, даже если данные между процессами будут обмениваться правильно. В противном случае все работает нормально, и программа завершается с помощью подвески. Может кто-нибудь объяснить мне почему?UNIX FIFO: процесс зависает, если я не закрываю входную сторону fifo
Благодарим за ваше терпение. Вот код основной функции:
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("An argument must be specified\n");
return -1;
}
int ret = mkfifo("./fifo.txt", 0644);
char buf;
if(ret < 0)
{
perror("Error creating FIFO");
return -1;
}
pid_t pid = fork();
if(pid < 0)
{
perror("Error creating child process");
return -1;
}
if(pid == 0) /* child */
{
int fd = open("./fifo.txt", O_RDONLY); /* opens the fifo in reading mode */
while(read(fd, &buf, 1) > 0)
{
write(STDOUT_FILENO, &buf, 1);
}
write(STDOUT_FILENO, "\n", 1);
close(fd);
return 0;
}
else /* father */
{
int fd = open("./fifo.txt", O_WRONLY); /* opens the fifo in writing mode */
write(fd, argv[1], strlen(argv[1]));
close(fd);
waitpid(pid, NULL, 0);
return 0;
}
}
Не может быть, что детский процесс ухаживает, потому что он ждет, когда отец закроет ФИФО, но так как отец не делает этого, ребенок ждет навсегда, чтобы ФИФО был закрыт, а отец тоже ждет ребенок заканчивается? – matteoamc