Liunx系统编程--进程通信(二),命名管道

Liunx系统编程–进程通信(二),命名管道

特点

  • FIFO可以在无关的进程之间交换数据,与无名管道不同。
  • FIFO 有路径名(无名管道没有)与之相关联,它以一种特殊设备文件形式存在于文件系统中。
  • 管道中的数据被读走就没了,同时保持FIFO先进先出的特点。
#include <sys/stat.h>
#include <sys/types.h>
int mkfifo(const char *pathname, mode_t mode);
返回值:成功返回0,出错返回-1

mode 权限值
pathname 路径
//创建了一个 FIFO,就可以用一般的文件I/O函数操作它。
当 open 一个FIFO时,//是否设置非阻塞标志(O_NONBLOCK)//的区别
若没有指定O_NONBLOCK(默认)
只读open 要阻塞到某个其他进程为写而打开此 FIFO。
只写open 要阻塞到某个其他进程为读而打开它。
若指定了O_NONBLOCK,则只读 open 立即返回。而只写 open 将出错返回 -1 如果没有进程已经为读而打开该 FIFO,其errno置ENXIO

例子

//read.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include <errno.h>
#include <fcntl.h>
int main()
{
//      int mkfifo(const char *pathname, mode_t mode);
//      返回值为0,代表成功,-1为失败
//      int ret =mkfifo("./file",0060);
        if(mkfifo("./file",0600)==-1&&errno!=EEXIST)
        {
                printf("创建失败:\n");
                perror("why:\n");//调试信息函数
        }
        else
        {
                if(errno==EEXIST)
                {
                        printf("文件已经存在\n");
                }
  else
                        printf("创建成功:\n");
        }
        int fd;
        char buf[40]={0};
        fd=open("./file",O_RDONLY);
        if(fd>=0)
                printf("open success\n");
        //只读模式打开管道,必须有另一个进程只写打开管道,要不然会堵塞
        int read1=read(fd,buf,20);
        printf("读了%d个字节,内容为%s\n",read1,buf);
        //管道读取数据
        close(fd);
        return 0;
}
//write.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include <errno.h>
#include <fcntl.h>
int main()
{
// ssize_t read(int fd, void *buf, size_t count);
        char *buf="哈哈哈!";
        int fd = open("./file",O_WRONLY);//打开管道,O_WRONLY-只写模式打
开,如果没有另一个进程读它,程序会阻塞此处
        printf("write file success\n");
        write(fd,buf,strlen(buf));//写入数据
        close(fd);
        return 0;
}

扩展:

原文

上述例子可以扩展成 客户进程—服务器进程 通信的实例,
write的作用类似于客户端,可以打开多个客户端向一个服务器发送请求信息,read类似于服务器,它适时监控着FIFO的读端,当有数据时,读出并进行处理,每一个客户端必须预先知道服务器提供的FIFO接口,如下图:

可以打开多个客户端向一个服务器发送请求信息,read类似于服务器,它适时监控着FIFO的读端,当有数据时,读出并进行处理,每一个客户端必须预先知道服务器提供的FIFO接口,如下图:

Liunx系统编程--进程通信(二),命名管道

上一篇:ARM+Liunx项目(一)—基于工厂模式的树莓派+Liunx的智能家居系统(1)—框架设计


下一篇:兄弟连liunx初级-4..5Linux常用命令-帮用户命令