Linux进程间同步和通信2:命名管道


目录:
1. 半双工管道
2. 命名管道
3. 消息队列
4. 信号量
5. 信号
6. 共享内存


2 命名管道(FIFO,first in first out)

2.1 特点

  • 工作方式与普通管道大致相似。
  • 命名管道在文件系统中以特殊文件的形式存在。
  • 在FIFO中,必须使用open()函数显示的连接到管道。
  • 一般FIFO总是处于阻塞状态,如果打开时设置了读权限,则读进程将一直阻塞,直到其他进程打开该管道并向其中写入数据,反过来也成立。
  • 如果不希望在操作FIFO的时候发生阻塞,可以在调用open()函数的时候使用O_NONBLOCK标志。


    Linux进程间同步和通信2:命名管道_第1张图片
    命名管道工作流程

2.2 mkfifo()函数

#include 
#include 
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 
#include 
#include 
#include 
#include 

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;
}

你可能感兴趣的:(Linux进程间同步和通信2:命名管道)