gpt4 book ai didi

c - Linux 下 C 中带 FIFO 的 IPC

转载 作者:太空狗 更新时间:2023-10-29 12:35:53 25 4
gpt4 key购买 nike

我一直在尝试使用 FIFO 实现 IPC,我做了以下内容,它似乎工作正常,测试了几次,我觉得它不错。

问题是我需要注意什么,我知道读写将是原子的,因为我将在 PIPE_BUF 下方写入。

我是这样运行的

./作家

./读者./读者

我看到读者工作正常,例如第一个读者读 1 然后第二个读者读 2 和 3 然后第一个读者读 4 等等。

请注意,我在 here 中找到了代码我修改了它。

作家.c

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
int main()
{
int fd,fd1;
fd=open("fifo1",O_WRONLY);
int data = 1;
while (1){
write(fd,&data,sizeof(int));
usleep(10);
data++;
}

//printf("File Content :%s",s1);
}

阅读器.c

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
int main()
{
int fd,fname;
mkfifo("fifo1",0600);
fd=open("fifo1",O_RDONLY);
int d = 0;
while(read(fd,&d,sizeof(int))!=0)
{
printf("%d\n",d);
usleep(10);
}
close(fd);
}

最佳答案

如果某个读取进程处于饥饿状态,它会在 read 系统调用上被阻塞,而写入进程最终会被内核调度并写入一些东西。 PIPE_BUF 限制仅与单个消息的最大大小有关(例如,阅读,您不会达到该大小)。

对称地,如果 writer 写入很多,fifo 缓冲区会变满(在 PIPE_BUF 之上)并且 write 系统调用在 writer 进程中被阻塞。最终调度程序将运行读取器。

参见 read(2)write(2)手册页。了解poll(2)当您想要多路复用时也可能会有所帮助。另见 fifo(7) .

PIPE_BUF 是对每个原子读写的限制。更大的读写只能部分完成。内核保证如果可以在少于 PIPE_BUF 字节的情况下实现读取或写入操作(即当有这样数量的字节可用时!),它将在管道和相关文件描述符上全部完成(例如 FIFO)。

阅读advanced unix programming和/或 advanced linux programming书籍

关于c - Linux 下 C 中带 FIFO 的 IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11805849/

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