命名管道和匿名管道

2023-05-16

我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。
管道分为三种:

  • 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。
  • 流管道:去除了第一种限制,为半双工,可以双向传递,
  • 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。

1、普通管道
int pipe(int fds[2]);//返回值0表示成功,-1表示失败

fd[0]:读 fd[1]:写

子进程往管道中写数据,写数据时要关闭读端
父进程往管道中读数据,写数据时要关闭写端


利用管道实现简单的操作,在管道中写入数据再读出:

#include <stdio.h>
  2 #include <unistd.h>
  3 #include <string.h>
  4 #include <stdlib.h>
  5
  6 int main(void)
  7 {
  8     int fds[2];
  9     if(pipe(fds)==-1)
10         perror("pipe"),exit(1);
11     pid_t pid=fork();
12     if(pid==-1) perror("fork"),exit(1);
13
14     if(pid==0){//子进程
15         close(fds[0]);//关闭读端
16         sleep(1);
17         write(fds[1],"abj",3);//在写端上写入abj
18         close(fds[1]);//再关闭写端
19         exit(0);
20     }else{//父进程
21         close(fds[1]);//关闭写端
22         char buf[100]={};
23         int r=read(fds[0],buf,100);//将管道中的数据读到buf中,返回值是实际读取的字节数
24         if(r==0)//读取的自己为0,代表读取文件结束
25         printf("read EOF\n");
26         else if(r==-1){
27             perror("read"),exit(1);
28         }
29         else if(r>0)
30             printf("buf=[%s]\n",buf);
31         close(fds[0]);//读取成功,关闭读端
32         exit(0);
33     }
34 }
35


2、匿名管道 :
管道的创建

管道文件大小为0,没有情缘关系的文件也能通过管道名,来取到该管道中的缓存。

//创建管道文件
int mkfifo(const char *name,mode_t mode)

//打开管道文件
int fd=open(name,O_RDONLY);读
int fd=open(name,O_WRONLY);写

//read/write,语义和匿名管道一样
利用命名管道实现文件的复制,代码如下:
1)、将文件写入命名管道中

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

int main(char argc,char *argv[])
{
        mkfifo("tp",0644);//创建一个命名管道
        int infd=open("abc",O_RDONLY);//表示要复制的文件
        if(infd<0)
                perror("open"),exit(1);
        int outfd=open("tp",O_WRONLY);//写入到管道文件中
        if(outfd<0)
                perror("open"),exit(1);
        char buf[100];
        int n=0;
        while((n=read(infd,buf,100))>0){
                write(outfd,buf,n);//往outfd中写入数据
        }
        close(infd);
        close(outfd);
        return 0;
}

2)、将管道中的数据导入到拷贝文件中

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main(int argc,char *argv[])
{
        int outfd=open("abc_bk",O_RDONLY|O_WRONLY|O_CREAT|O_TRUNC,0644);//需要拷贝的文件
        if(outfd<0)
                perror("open"),exit(1);
        int infd=open("tp",O_RDONLY);//打开管道,将管道中的数据读走
        if(infd<0)
                perror("open"),exit(1);
        char buf[100];
        int n;
        while((n=read(infd,buf,100))>0){
                write(outfd,buf,n);
        }
        close(infd);
        close(outfd);
        unlink("tp");//删除指定名字的文件
        return 0;
}

3、匿名管道和命名管道的区别:

匿名管道是由pipe函数创建 并打开的
命名管道是由mkfifo函数创建 的 ,打开用open
命名管道和匿名管道唯一的区别就是在创建的打开,一旦这些工作完成后,它们有相同的意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

命名管道和匿名管道 的相关文章

随机推荐

  • Git操作:一份代码同时提交两个Git仓库

    前言 xff1a 最近想把一份代码上传到两个git仓库 xff0c 用到正好分享 查看Git仓库 首先查看Git代码绑定了哪些Git仓库 git remote v 添加远程仓库地址 git remote add orgin http git
  • Docker安装MySQL主从配置

    今天学习Docker安装MySQL主从配置 一 Master 1 1 拉取镜像 docker pull mysql 8 0 25 1 2 新建MySQL主服务器的容器实例 xff0c 端口为3306 docker run p 3306 33
  • Jmeter测试oracle数据库

    1 oracle连接数据库 select oracle jdbc OracleDriver jdbc oracle thin 64 10 1 1 39 1521 orcl xxxx xxxx select 语句 xff1a SELECT F
  • 在32位系统上处理64位数的计算时需要注意的点

    其他人分享 xff1a 待看 https blog csdn net xhz1234 article details 8828220 stm 64位整数加减乘除时须注意的一点 qiezhihuai的博客 CSDN博客
  • Ubuntu16.04_ROS_kinetic下如何使用OpenCV2.4进行编译

    Ubuntu16 04 ROS kinetic下如何使用OpenCV2 4进行编译这一问题卡了我将近两天时间 试了网上大部分的方法但都失败了 xff0c 后来采取论坛上一个大神的方法 xff0c 直接下载opencv2的源文件作为包编译到自
  • ROS学习笔记(二)- ROS驱动机器人实例

    利用周末玩了一下先锋机器人 xff08 Pioneer3 P3AT xff09 xff0c 前后装了两次ROS xff0c 以及一大堆操作细节 xff0c 打算整理记录一下方便以后解决问题用 xff0c 同时通过实际操作 xff0c 对上一
  • 模块化程序设计——在keil中利用头文件整理程序

    模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块 xff0c 每个小程序模块完成一个确定的功能 xff0c 并在这些模块之间建立必要的联系 xff0c 通过模块的互相协作完成整个功能的程序设计方法 xff08 复制
  • 前端面试谈:项目经历的 STAR 法则

    大家好 xff0c 我是前端西瓜哥 xff0c 今天来看看简历中阐述项目经历的 STAR 法则是什么 STAR 法则是什么 xff1f 我们写简历中的项目经历时 xff0c 一种常见的思路就是 STAR 法则 STAR 是四个单词的首字母和
  • Promethes+grafana 监控Minio集群

    export MINIO PROMETHEUS AUTH TYPE 61 public target 中间要有空格 grafana 模板 12063 11148 13502 https grafana com grafana dashboa
  • 【开发者portal在线开发插件系列一】profile和基本上下行消息

    转载 xff1a https bbs huaweicloud com forum thread 13087 1 1 html 前言 xff1a 开发者portal支持在线开发profile xff08 即设备建模 xff09 在线开发插件
  • ubuntu安装vscode详细教程

    ubuntuvscode安装后打不开问题 这个有个坑 xff0c 有的电脑一次成功 xff0c 有的安装不了 不要下载最新版本 xff0c 下载之前的旧版本 xff1a Visual Studio Code April 2020 注意ubu
  • BC26 OPEN开发之--LWM2M连接分析

    翔神教你学NB BC26 OPEN开发之 LWM2M连接分析 前言 xff1a NB IOT商用已经2年多了 xff0c 三大运营商都建设了大量的NB网络 xff0c 尤其以中国电信最为积极 xff0c 各个模组厂家推出了大量的NB模组 x
  • STM32F429I-DISO探索第二篇 --SDRAM

    有需要STM32F429I DISCO套件的 可以点击 xff1a http item taobao com item htm spm 61 686 1000925 1000774 24 TtTrrN amp id 61 366498110
  • STM32F429I_DISCO 国外大牛做的示波器

    谷歌上搜到的 xff0c coocox网站一直打不开 xff0c 今天突然能打开了 xff0c 就下载来看了一下 xff0c 效果还是不错的 嘻嘻 下面是原帖 xff1a Oscilloscope Project for STM32F429
  • 临界区和开关中断的区别

    本篇文章是为了说明进入临界段与普通的禁止和使能中断的区别 普通的禁止和使能中断 xff0c 在禁止中断时有触发中断的事件发生 xff0c 当使能中断时该中断不会在响应 xff0c 说明普通的禁止中断是阻止了中断的发生 而在进入临界段时 xf
  • ST Nucleo mbed套件开发 一 MBED环境使用 以Nucleo-F401为例

    全球领先的半导体供应商 全球领先的ARM Cortex M微控制器厂商意法半导体 xff08 STMicroelectronics xff0c 简称ST xff09 进一步强化STM32系列微控制器的易用性和设计灵活性 xff0c 推出适用
  • 记一次失败的面试经历

    背景 xff1a 面试者 xff1a 王某 xff08 以下简称我 xff09 嵌入式行业刚入门 10年工作经历 从事方向为 xff1a GPS BD导航 xff0c 物联网 xff0c 车联网方向 面试官 xff1a 前华为员工 3年工作
  • BC26接入电信平台操作手册 (五)

    二 模块端指令操作 一 获取模块的IMEI号 AT 43 CGSN 61 1 43 CGSN 866971030545227 OK 二 查询射频开关 AT 43 CFUN 43 CFUN 1 OK 三 查询信号质量 AT 43 CESQ 4
  • Cortex M3处理器工作模式及中断过程

    1 工作模式 线程模式 xff08 Thread mode xff09 xff1a 处理器复位或异常退出时为此模式 此模式下的代码可以是特权代码也可以是用户及代码 xff0c 通过CONTROL 0 控制 处理模式 xff08 Handle
  • 命名管道和匿名管道

    我们知道进程间是可以通信的 可以达到数据传输 资源共享 事件通知 进程控制等目的 进程间通信主要包括管道 系统IPC xff0c 套接字等 管道分为三种 xff1a 普通管道 xff1a 一是单工 xff0c 只能单向传输 xff0c 二是