【博客168】IPC(进程间通信)——命名管道

内容: 命名管道是另一种管道,他可以在无血缘关系的进程之间使用

函数原理:

1、FIFO是linux基础文件类型中的一种,但FIFO文件在磁盘上没有数据,仅仅用来标识内核中一条通道。

2、各进程可以打开这个文件进行read/write,实际上是读写内核通道,这样就实现了进程间通信。

创建fifo文件函数接口:

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

命令行直接创建: mkfifo 管道文件名

管道打开规则:

1、如果当前打开操作是为读而打开FIFO时
O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO
O_NONBLOCK enable:立即返回成功

2、如果当前打开操作是为写而打开FIFO时
O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO
O_NONBLOCK enable:立即返回失败,错误码为ENXIO

代码示例:

一、数据写入代码:

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

int main(int argc,char *argv[]){
    if(argc != 2){
        printf("please input the fifo !\n");
        return -1;
 
    }

    int fd = open(argv[1],O_WRONLY);
    while(1){
        write(fd, "hello world", strlen("hello world") + 1);
        sleep(1);
    }
    close(fd);
    return 0;
}

二、数据读出代码:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main(int argc,char *argv[]){
    if(argc != 2){
        printf("./a.out fifoname\n");
        return -1;
 
    }
    int fd = open(argv[1],O_RDONLY);
    char buf[12];
    int ret ;
    while(1){
        sleep(2);
        ret = read(fd,buf,sizeof(buf));

        if(ret > 0){
            printf("read:%s\n",buf);
        }
        memset(buf,'\0',sizeof(buf));
    }
    close(fd);
    return 0;
}

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

大四学生一枚,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。有喜欢C/C++,linux的同学欢迎私信一起讨论学习。

发布了214 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43684922/article/details/104462468