私はUNIX FIFOで作業を始めました。最初のFIFOプログラムで何かを発見しました。プログラムはこのように動作します:FIFOを作成した後、fork()
関数を使用して2つのプロセスが開始されます。子プロセスは、父親が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;
}
}
父親がFIFOを閉じるのを待っているので子プロセスがスタックすることはありますか?父親はそれをしないので、子供はFIFOが閉じられるのを永遠に待っています。子供は終了する? – matteoamc