【Linux 进程间通信】管道和共享内存

news2024/12/24 8:14:50

1.进程间通信的概念

2.匿名管道

匿名管道的5个特点

  1. 管道是一个单向通信的通信信道;

  1. 匿名管道作用与具有血缘关系的进程,常用于父子进程;

  1. 管道是一个文件,生命周期随进程;

  1. 管道自带同步机制、原子性;

  1. 管道是面向字节流;

管道的4种结果

  1. 读端快且写端慢或者不写,读端要等待写端;

  1. 写端快且读端慢或者不读,写端要等待读端;

  1. 读端关闭,写端收到SIGPIPE信号直接终止

  1. 写端关闭,读端读完pipe内部的数据,然后再读会返回0,表明已经读到文件结尾;

pipe函数

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

int main()
{
    int pipefd[2]={0};//创建匿名管道
    if(pipe(pipefd)!=0)
    {
        perror("pipe error!\n");
        exit(1);
    }
    if(fork()==0)//创建子进程
    {
        close(pipefd[0]);//子进程关闭读
        const char* message="hello world\n";
        while(1)
        {
            write(pipefd[1],message,strlen(message));
            sleep(1);
        }
        exit(1);
    }
    close(pipefd[1]);//父进程关闭写
    while(1)
    {
        char* buffer[64];
        ssize_t s=read(pipefd[0],buffer,sizeof(buffer)-1);
        if(s==0)
        {
            printf("子进程关闭写入\n");
            break;
        }
        else if(s>0)
        {
            buffer[s]=0;
            printf("child say to father:%s",buffer);
        }
        else//s==0说明写端关闭,且读端把内容读完
        {
            printf("读取失败\n");
            break;    
        }
    }
    return 0;
}

执行结果

原理

3.命名管道

命名管道的情况和特点和匿名管道相同,但是命名可以运用到任意进程

mkfifo函数

server.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#define MYFIFO "./myfifo"

int main()
{
    umask(0);//把umask设置0
    if(mkfifo(MYFIFO,0666)<0)
    {
        perror("mkfifo fail\n");
        exit(1);
    }
    int fd = open("myfifo",O_RDONLY);//服务器端以读方式打开文件
    if(fd<0)
    {
        perror("open fail\n");
        exit(2);
    }
    while(1)
    {
        char buffer[64];
        ssize_t s=read(fd,buffer,63);//read返回值读取的字节数
        if(s>0)
        {
            buffer[s]=0;
            if(strcmp(buffer,"ls")==0)//输入ls就进程替换ls -l命令
            {
                execlp("ls","ls","-l",NULL);
                return(1);
            }
            else
                printf("client say to server:%s\n",buffer);
        }
        else if(s==0)
        {
            printf("client close");
            break;
        }
        else
        {
            printf("read fail");
            break;
        }
    }
    return 0;
}

client.c

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
#define MYFIFO "./myfifo" 

int main()
{
    int fd=open(MYFIFO,O_WRONLY);//用户端以写的方式打开管道文件
    if(fd<0)
    {
        perror("open\n");
        return 1;
    }
    while(1)
    {
        char message[64];
        printf("please enter:");
        fflush(stdout);//刷新标准输出流
        ssize_t s=read(0,message,63);//从键盘读
        message[s]=0;
        write(fd,message,strlen(message)-1);//写到管道文件的缓冲区
    }
    return 0;
}

进程使用管道通信,不会把内容写到磁盘中去,会在缓冲区中读写;

4.共享内存

共享内存的效率是最高的因为它是使用直接虚拟地址映射来写入和读写数据的,不像管道需要使用read和write来读写

4.1共享内存的创建

shmget和ftok接口

#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>

#define PATHNAME "./"
#define PROJID 0x5555
int main()
{
    key_t key=ftok(PATHNAME,PROJID);//获取一个唯一key值
    int shmid=shmget(key,4096,IPC_CREAT);//创建共享内存

    printf("key:%d,shmid:%d\n",key,shmid);
    return 0;
}

创建共享内存,程序执行完毕不会被OS回收

4.2删除共享内存

命令行:

代码:

    shmctl(shmid,IPC_RMID,NULL);//删除共享内存

4.3进程连接到共享内存(shmat),去关联(shmdt)

4.4简单使用共享内存通信

clien.c

#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#define PATHNAME "./"
#define PROJID 0x5555

int main()
{
    key_t key=ftok(PATHNAME,PROJID);
    int shmid=shmget(key,4096,IPC_CREAT|0666);
    char* mem=shmat(shmid,NULL,0);//关联
    printf("client process attaches success\n");
    while(1)//打印共享内存的内容
    {
        printf("%s\n",mem);
        sleep(1);
    }
    shmdt(mem);//去关联
    return 0;
}

server.c

#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#define PATHNAME "./"
#define PROJID 0x5555
int main()
{
    key_t key=ftok(PATHNAME,PROJID);
    int shmid=shmget(key,4096,IPC_CREAT|0666);//创建一个共享内存并初始化权限为0666;
    if(shmid<0)
    {
        perror("shmget\n");
        return 1;
    }
    char* mem=(char*)shmat(shmid,NULL,0);//关联
    printf("server process attaches success\n");
    char i='a';
    while(i<='z')//往共享内存写入数据
    {
        mem[i-'a']=i;
        i++;
        mem[i-'a']=0;
        sleep(2);
    }
    shmdt(mem);//去关联
    printf("server process detach success\n");
    shmctl(shmid,IPC_RMID,NULL);//关闭共享内存
    printf("shared memory close\n");
    return 0;
}

执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉查找树的应用 —— K模型和KV模型

文章目录前言1. K模型2. KV模型&#x1f351; 构建KV模型的树&#x1f351; 英汉词典&#x1f351; 统计水果出现的次数3. 总结前言 在上一篇文章中&#xff0c;我们进行了二叉查找树的实现&#xff08;文章链接&#xff09;&#xff0c;那么今天主要探讨一下二叉查找树的应用…

阻塞队列、阻塞队列的实现原理、七种阻塞队列分析及源码解读、使用阻 塞队列来实现生产者-消费者模型

文章目录面试回答参考语术七种队列分析及源码解读ArrayBlockingQueue2.1.0 ArrayBlockingQueue分析2.1.1 ArrayBlockingQueue源码解读&#xff1a;LinkedBlockingQueue2.2.0 LinkedBlockingQueue分析2.2.1 LinkedBlockingQueue源码解读2.3 LinkedBlockingQueue 与 ArrayBlockin…

【浅学Redis】Spring Cache的基础使用

用SpringCache操作Redis缓存数据1. Spring Cache是什么2. Spring Cache 常用注释3. Spring Cache 的使用步骤4. 使用Spring Cache操作Redis1. Spring Cache是什么 Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单的加一个注解&#xff0c;…

计算机视觉框架OpenMMLab开源学习(六):语义分割基础

✨写在前面&#xff1a;强烈推荐给大家一个优秀的人工智能学习网站&#xff0c;内容包括人工智能基础、机器学习、深度学习神经网络等&#xff0c;详细介绍各部分概念及实战教程&#xff0c;通俗易懂&#xff0c;非常适合人工智能领域初学者及研究者学习。➡️点击跳转到网站。…

工地安全帽智能识别系统 YOLOv5

工地安全帽智能识别系统通过opencv深度学习技术&#xff0c;实现对现场人员的安全帽反光衣穿戴进行自动实时识别和检测。我们选择当下YOLO最新的卷积神经网络YOLOv5来进行识别检测。6月9日&#xff0c;Ultralytics公司开源了YOLOv5&#xff0c;离上一次YOLOv4发布不到50天。而且…

Allegro172版本线到铜皮不按照设定值避让的原因和解决办法

Allegro172版本线到铜皮不按照设定值避让的原因和解决办法 用Allegro做PCB设计的时候,有时会单独给某块铜皮附上线到铜皮额外再增加一个数值,如下图 在规则的基础上,额外再避让10mil 规则避让line到铜皮10.02mil 额外设置多避让10mil,避让的结果却是30.02mil,正确的是20.…

2023金三银四季跳槽季,啃完这软件测试面试题,跳槽不就稳稳的了

前言 2023年也到来了&#xff0c;接近我们所说的“金三银四”也正在执行了&#xff0c;时间晃眼就过去了&#xff0c;有的人为了2023跳槽早早做足了准备&#xff0c;有的人在临阵磨刀&#xff0c;想必屏幕前的你也想在2023年涨薪吧&#xff0c;那么问题来了&#xff0c;怎么才…

day4——与数组有关的练习

今天是学习java的第四天&#xff0c;主要内容有 给循环起一个标签数组的定义以及数组的初始化 给循环起一个标签 给循环起一个标签&#xff0c;简单的说就是给循环起一个名字&#xff0c;内部的循环可以控制外部的循环&#xff0c;外部的循环可以控制内部的循环&#xff0c;…

第四章:搭建Windows server AD域和树域

由于Windows简单一点&#xff0c;我就先搞Windows了。AD域&#xff1a;视频教程&#xff1a;https://www.bilibili.com/video/BV1f84y1G72x/在创建AD域时要把网卡配置好这是打开网卡界面的命令DNS要改成自己的&#xff0c;因为在创建域的同时也会自动创建DNS打开服务器管理器&a…

LANP架构搭建

安装Apache解压apache安装包&#xff08;httpd-2.4.17.tar.gz&#xff09;到 /usr/src/目录下面tar -zxvf /root/httpd-2.4.17.tar.gz -C /usr/src/安装httpd所需要的依赖包yum -y install zlib* openssl* apr* pcre-devel openssl*进入httpd目录&#xff0c;安装httpd所需要的…

个人ChatGPT账号注册

作者&#xff1a;Bruce.Dgithub&#xff1a;https://github.com/doukoi-BDB文章底部有【技术社群&福利】&#xff0c;不定更新活动、源码&#xff0c;欢迎来撩~~~今日主题&#xff1a;1、ChatGPT 账号注册2、预计阅读 6 分钟&#xff0c;正文2000字。最近啊 一款类似人工智…

服务降级和熔断机制

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;服务降级和熔断机制 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪…

状态机设计中的关键技术

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;文章和代码已归档至【Github仓库&#xf…

IT行业寒冬,干测试从月薪18k降到了15k,“我”的路在何方

今天已经是2.10了&#xff0c;马上就是金3银4了&#xff0c;2023年才开始&#xff0c;是的&#xff0c;正值春天&#xff0c;想到了一首诗词自古逢秋悲寂寥&#xff0c;我言秋日胜春朝。晴空一鹤排云上&#xff0c;便引诗情到碧霄。秋天&#xff0c;意味着收获&#xff0c;也意…

【C语言】“指针类型”与“野指针”

文章目录一、指针是什么❔二、指针和指针类型1.指针-整数2.指针解引用三.野指针1.引起野指针的原因2.如果避免野指针完结一、指针是什么❔ 指针也就是 内存地址 &#xff0c;在计算机上我们访问数据需要通过内存地址来访问&#xff0c;在C语言中&#xff0c;指针变量是用来存放…

如何编写Python程序调用ChatGPT,只需3步

如何编写Python程序调用ChatGPT&#xff0c;只需3步 在ChatGPT官网进行注册&#xff0c;注册成功后就可以对ChatGPT进行提问&#xff0c;ChatGPT的注册流程参考这篇文章——手把手教你注册ChatGPT&#xff0c;亲测可用。 来看看ChatGPT&#xff0c;如何回答”ChatGPT是什么“…

Deepwalk深度游走算法

主要思想 Deepwalk是一种将随机游走和word2vec两种算法相结合的图结构数据的挖掘算法。该算法可以学习网络的隐藏信息&#xff0c;能够将图中的节点表示为一个包含潜在信息的向量&#xff0c; Deepwalk算法 该算法主要分为随机游走和生成表示向量两个部分&#xff0c;首先…

c++11 标准模板(STL)(std::multimap)(三)

定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…

SCI论文阅读-使用基于图像的机器学习模型对FTIR光谱进行功能组识别

期刊&#xff1a; Analytical Chemistry中科院最新分区&#xff08;2022年12月最新版&#xff09;&#xff1a;1区(TOP)影响因子&#xff08;2021-2022&#xff09;&#xff1a;8.008第一作者&#xff1a;Abigail A. Enders通讯作者&#xff1a;Heather C. Allen 原文链接&…

自己家用的电脑可以架设游戏吗

自己家用的电脑可以架设游戏吗家用电脑怎么用来做服务器呢&#xff1f;我是艾西&#xff0c;今天我跟大家详细的说家用电脑可以当服务器使用吗&#xff1f;咱们先把家用电脑不足的点列出来就清楚了一、外网端口映射以前的宽带大多数是adsl拨号&#xff0c;再搭配一个TP路由器&a…