在上一篇说的管道为匿名管道(pipe),本篇是另一种进程间通信方式,命名管道(fifo)


匿名管道的生命周期随进程

命名管道的生命周期随系统


匿名管道不能在没有血缘关系的进程(如父子,兄弟进程)间进行通信,而命名管道解决了这一问题

它是可以在任何进程间进行通信的一种特殊文件


有两种方式可以进行管道的创建:一是在shell下交互地建立一个命名管道,二是通过函数mkfifo();

  

一.shell方式下可通过mknod和mkfifo命令来创建管道

二.用mkfifo()创建

  

 #include <sys/types.h>

 #include <sys/stat.h>

 int mkfifo(const char *pathname, mode_t mode);


pathname为创建管道的全路径名,mod为创建的命名管道的存取模式和权限(umask会影响其权限)


代码如下:(server为read端,client为write端)


server读端:

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

int main()
{
    umask(0);
    if(mkfifo("./.fifo",S_IFIFO | 0666)<0){//failed
        perror("mkfifo");
        return -1; 
    }   
    int _fd=open("./.fifo",O_RDONLY);
    if(_fd==-1){
        perror("open");
        return -1; 
    }   
    while(1){
        char buf[1024];
        memset(buf,'\0',sizeof(buf));
         ssize_t _size=read(_fd,buf,sizeof(buf));
        if(_size<=0){
            printf("client has quit or error\n");
            break;
        }
        else if(_size>0){
            buf[_size-1]='\0';
            printf("client is say# %s\n",buf);
        }
    }
    close(_fd);
    return 0;
}

client写端:

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

int main()
{
    int _fd=open("./.fifo",O_WRONLY);
    if(_fd==-1){
        perror("open");
        return -1;
    }
    while(1){
        char buf[1024];
        memset(buf,'\0',sizeof(buf));
        printf("Please Write Your words:");
        fflush(stdout);
        if(read(0,buf,sizeof(buf)-1)<0){
            perror("read");
            return -1;
        }
        ssize_t _size=write(_fd,buf,strlen(buf));
        if(_size<0){
            perror("write");
            return -1;
        }
    }
    close(_fd);
    return 0;
}

运行结果如下:

wKiom1cKJW6T3-02AAAneuLQp8c377.png

当client端发消息时,server端回立刻收到,当client端退出时,server端会输出“client has quit or error”