Linux:使用有名管道(FIFO)进行通信

和匿名管道学习方法相同,先过一遍基础

有名管道:FIFO 用ls -l命令可找到类似 ->p 的就是管道
与匿名管道相同,都属于伪文件,不占用磁盘空间。在内存中有一个缓冲区
通信方式:半双工
用于没有血缘关系的两个进程间通信
创建方式:
(1)命令:mkfifo 管道名
(2)函数:mkfifo
fifo文件可以使用IO函数进行操作:open/close,write/read,不能执行lseek操作

write_fifo.c

#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc,char *argv[])
{
    if(argc < 2)
    {
        printf("./a.out fifoname\n");
        exit(1);
    }

    //判断文件是否存在
    int ret = access(argv[1],F_OK);
    if(ret == -1)
    {
        int r = mkfifo(argv[1],0664);
        if(r == -1)
        {
            perror("mkfifo error");
            exit(1);
        }
        printf("有名管道%s创建成功\n",argv[1]);
    }

    int fd = open(argv[1],O_WRONLY);
    if(fd == -1)
    {
        perror("open error");
        exit(1);
    }

    char *p = "hello world!";
    while(1)    
    {
        sleep(1);
        int len = write(fd,p,strlen(p) + 1);
    }

    close(fd);

    return 0;
}

read_fifo.c

#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc,char *argv[])
{
    if(argc < 2)
    {
        printf("./a.out fifoname\n");
        exit(1);
    }

    //判断文件是否存在
    int ret = access(argv[1],F_OK);
    if(ret == -1)
    {
        int r = mkfifo(argv[1],0664);
        if(r == -1)
        {
            perror("mkfifo error");
            exit(1);
        }
        printf("有名管道%s创建成功\n",argv[1]);
    }

    int fd = open(argv[1],O_WRONLY);
    if(fd == -1)
    {
        perror("open error");
        exit(1);
    }

    char buf[512];
    while(1)    
    {
        int len = read(fd,p,strlen(p) + 1);
        buf[len] = 0;
        printf("buf = %s\n,len = %d",buf,len);
    }

    close(fd);

    return 0;
}

你可能感兴趣的:(Linux)