目录:
1. 半双工管道
2. 命名管道
3. 消息队列
4. 信号量
5. 信号
6. 共享内存
2 命名管道(FIFO,first in first out)
2.1 特点
- 工作方式与普通管道大致相似。
- 命名管道在文件系统中以特殊文件的形式存在。
- 在FIFO中,必须使用open()函数显示的连接到管道。
- 一般FIFO总是处于阻塞状态,如果打开时设置了读权限,则读进程将一直阻塞,直到其他进程打开该管道并向其中写入数据,反过来也成立。
-
如果不希望在操作FIFO的时候发生阻塞,可以在调用open()函数的时候使用O_NONBLOCK标志。
命名管道工作流程
2.2 mkfifo()函数
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(
const char *pathname,
mode_t mode
);
- 调用mkfifo()函数后,会在依据pathname建立特殊的FIFO文件,此文件必须不存在才能创建。
- 创建成功返回0,失败返回-1,错误原因存于errno中。
- 参考:https://blog.csdn.net/superywf/article/details/73438465
2.3 mkfifo()例程
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
char buf[80];
int fd;
pid_t pid;
int ret;
unlink("./my_fifo");//删除文件
mkfifo("./my_fifo",0777);
pid=fork();
if(pid==-1)
{
printf("fork error\n");
return -1;
}
if(pid==0)
{
char s[]="hello\n";
fd=open("./my_fifo",O_RDONLY);
ret=write(fd, s, sizeof(s));
printf("child has write %d to fifo\n",ret);
close(fd);
}
else
{
fd=open("./my_fifo",O_RDONLY);
read(fd,buf, sizeof(buf));
printf("read from fifo:%s\n",buf);
close(fd);
}
return 0;
}
网友评论