gpt4 book ai didi

c - 子进程写完 FIFO 后,父进程如何读取 FIFO?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:57 26 4
gpt4 key购买 nike

我有一个非常简单的基本程序,它有两个进程,第一个是parent,第二个是child

子进程应该向 FIFO 写入一些内容。在所有写作工作完成后(在 child 被终止后)。然后父进程应该读取所​​有的 FIFO 文件并打印到 stdout

所以我认为,我需要一个 wait(NULL); 用于 parent。所以 parent 会等到 child 终止。但是 child 也因为写入而被阻塞,并且因为读取这个写入而被阻塞。所以两个进程互相等待,我想,会发生死锁。

我的程序是这样的:

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

int writeSomeStuffToFifo ();
void printAllFifo ();

char * myfifo = "myfifo";

int main(int argc, char **argv) {

int pid=0;
int childPid=-1;
int status;
pid=fork();


if ((pid = fork()) < 0){
perror("fork() error");
}
else if (pid == 0) {
writeSomeStuffToFifo ();
exit(1);
}
else do {
if ((pid = waitpid(pid, &status, WNOHANG)) == -1)
perror("wait() error");
else if (pid == 0) {
//child running
printf("child running\n");
}
else {
if (WIFEXITED(status)){
printf("child is terminated\n");
printAllFifo();
}
else{
printf("child did not exit successfully\n");
}
}
} while (pid == 0);


return 0;
}


int writeSomeStuffToFifo (){ //child process will run this function
int fd;
mkfifo(myfifo, 0666);

fd = open(myfifo, O_WRONLY);
write(fd,"foo1\n",strlen("foo1\n"));
close(fd);

fd = open(myfifo, O_WRONLY);
write(fd,"foo2\n",strlen("foo2\n"));
close(fd);

fd = open(myfifo, O_WRONLY);
write(fd,"foo3\n",strlen("foo3\n"));
close(fd);
}


void printAllFifo (){ //parent process will run this function
int fd=open(myfifo, O_RDONLY);
char* readBuffer=(char*)malloc((strlen("foo1\n")+strlen("foo2\n")+strlen("foo3\n"))*sizeof(char));
read(fd, readBuffer, strlen("foo1\n")+strlen("foo2\n")+strlen("foo3\n"));
printf("%s\n",readBuffer );
close(fd);
}

最佳答案

mkfifo() 创建一个有限大小的管道。您不应该在父进程中等到子进程完成后再读取,您应该在父进程中不断读取,同时检查子进程是否已经终止。

您可以使用 ulimit -p 来读取 linux 系统中管道的默认大小。该数字是 512 的倍数,因此值 8 表示 4096 字节。

使用 pipe()mkfifo() 更适合这项任务,因为您实际上不需要命名管道。这将为您提供 2 个 fds,一个用于读取,一个用于写入。在父代码中关闭写入 fd,在子代码中关闭读取 fd,然后您可以从父代码中的管道开始读取,直到返回值 <= 0。这意味着子进程已终止(并且管道已关闭以进行写入)。那么你只需要从父代码调用waitpid()来收集终止的子进程。

关于c - 子进程写完 FIFO 后,父进程如何读取 FIFO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55395453/

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