Linux进程间通信之命名管道

Linux进程间通信之命名管道



0.背景知识

学习命名管道需要了解管道的基本原理,这部分内容在上一篇文章 Linux进程间通信之匿名管道(点击直达) 有所提及,建议先学习命名管道


1.命名管道 fifo

血缘关系的进程之间通信可以使用匿名管道 pipe,无血缘关系的两个进程如何进行数据传递呢?
命名管道 fifo,使用 一个磁盘上的 fifo 文件,标识内核中的一条管道通路,该 fifo 文件数据部分大小0。进程 A 和进程 B 可以使用打开文件的方式打开 myfifo 文件,进行 write and read,实际上读写的还是 myfifo 标识的内核中的缓冲区
在这里插入图片描述


2.mkfifo 函数介绍

2.1 函数原型

#include <sys/types.h>
#include <sys/stat.h>

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

2.2 函数功能

mkfifo 函数用于创建一个 命名管道文件。mkfifo函数具有一个同名的Linux 命令,同样用于创建 命名管道。此处我使用 mkfifo 命令创建了一个名为 myfifo命名管道文件,我们查看创建命名管道文件发现其并不占用硬盘空间,其文件类型p 管道类型
在这里插入图片描述

2.3 形参解释

  • 形参 const char* pathname:用于指定生成的 命名管道文件路径
  • 形参mode_t mode:用于指定生成命名管道文件的权限

2.4 返回值解释

  • 成功返回:0
  • 失败返回:-1,并且设置 errno

3.案例程序之两个无血缘关系进程数据传递

/**
 * 写进程 fifo_w.c
 */ 
#include <stdio.h>                                                            
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

/**
 * 打印错误信息
 */ 
void sys_error(const char* err, int exitno){
    perror(err);
    exit(exitno);
}

int main()
{
int fd = open("myfifo",O_WRONLY);
    if(-1 == fd){
        int ret = mkfifo("myfifo", 0777);
        if(-1 == ret)
            sys_error("mkfifo",-1);
        fd = open("myfifo", O_WRONLY);
    }
    char buf[1024] = "Later better than never.\n";
    int writed = write(fd, buf, strlen(buf));
    if(-1 == writed)
        sys_error("write",1);
    close(fd);
                                                                              
    return 0;
}
/**
 * 写进程 fifo_r.c
 */ 
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>                                                            
#include <unistd.h>
#include <string.h>

/**
 * 打印错误信息
 */ 
void sys_error(const char* err, int exitno){
    perror(err);
    exit(exitno);
}

int main()
{
    int fd = open("myfifo",O_RDONLY);
    char buf[1024];
    int readed = read(fd, buf, sizeof(buf));
    if(-1 == readed)
        sys_error("read",1);
    int ret = write(STDOUT_FILENO, buf, strlen(buf));
    if(-1 == ret)
        sys_error("write",1);                                                 
    close(fd);

    return 0;
}

程序运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值