gpt4 book ai didi

c - 为什么在我的程序中 "cat"一个FIFO特殊文件或创建一个FIFO特殊文件后没有出现shell提示?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:25 24 4
gpt4 key购买 nike

我正在学习 Linux 中的命名管道,并编写了以下程序来尝试一下。

以下程序创建一个名为“test.fifo”的 FIFO 特殊文件,然后创建两个子进程以从该命名管道读取和写入。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>

int main() {
pid_t pid[2];

// Create FIFO special file
mkfifo("test.fifo", 0644);

pid[0] = fork();
if (pid[0] < 0) {
printf("Fail to fork child process #0\n");
return 1;
} else if (pid[0] == 0) {
// Open FIFO special file in read mode
int in = open("test.fifo", O_RDONLY);

// Read data
char buf[256];
read(in, buf, 256);
printf("Child process #0 received: %s\n", buf);

// Close pipe
close(in);
return 0;
}

pid[1] = fork();
if (pid[1] < 0) {
printf("Fail to fork child process #1\n");
return 1;
} else if (pid[1] == 0) {
// Open FIFO special file in write mode
int out = open("test.fifo", O_WRONLY);

// Write data
char buf[256] = {0};
strcpy(buf, "Hello world");
write(out, buf, 256);

// Close pipe
close(out);
return 0;
}

return 0;
}

有时这个程序运行正常。但有时在这个程序运行后,我的 shell 提示消失了。

MyUserName@MyHostName:~$ ./a.out
MyUserName@MyHostName:~$ Child process #0 received: Hello world
(This is an empty line, no shell prompt occurs)

我尝试在空行中键入并运行命令 ls,该命令有效。所以看起来程序已经成功退出了,只是没有出现shell提示。

如果我运行命令 cat test.fifo,同样的事情也会发生。

MyUserName@MyHostName:~$ cat test.fifo
(This is an empty line, no shell prompt occurs)

发生了什么,为什么会这样?

最佳答案

由于父程序不wait(2) 子程序完成,当它执行exit(2)时(在最后一个返回0 ; in main) shell 显示提示符。但是您无法控制(甚至不知道) children 是否完成了他们的输出打印,因此 shell 提示符可能被其中一个 child 的输出覆盖。但是 shell 总是输出提示,但由于它没有换行(光标保持在同一行),所以它可能会被子级的输出覆盖。

尝试将以下内容放在最后一个 return 0; 之前:

wait(NULL);
wait(NULL); /* as you did two fork()s you can make up to two wait()s */

然后,程序终止将与 child 同步。

关于c - 为什么在我的程序中 "cat"一个FIFO特殊文件或创建一个FIFO特殊文件后没有出现shell提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49080052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com