首页 > 系统相关 >进程间通信IPC

进程间通信IPC

时间:2024-08-11 19:52:44浏览次数:20  
标签:IPC 文件 队列 间通信 管道 进程 共享内存

前言

        进程是操作系统中独立运行的程序单元,每个进程拥有自己的内存空间。由于进程之间的内存空间是隔离的,不能直接访问彼此的内存,因此需要借助IPC来实现进程间的数据交换

一.管道

进程间通信的本质是让不同的进程看到同一份资源,  我们先来看管道是如何做到的

管道特性

    1. 自带同步机制
    2. 多用于血缘关系进程进行通信,常见与父子
    3. pipe是面向字节流的
    4. 父子退出,管道自动释放,文件的生命周期是随进程的
    5. 管道只能单向通信

管道的四种情况

  1. 管道内部没有数据且子进程不关闭自己的写端文件,  读端就要阻塞等待,直到pipe有数据
  2. 管道内部被写满且读端不关闭自己的fd,  写端写满之后,写端就要阻塞等待
  3. 对于写端而言:关闭了pipe,  读端会将pipe中的数据读完,最后就会读到返回值为0,表示读结束,类似读到了文件的结尾
  4. 读端关闭,写端再写,OS会直接终止写入的进程(子进程),通过信号SIGPIPE(13)信号杀掉进程

匿名管道

原理

        父进程创建的子进程会继承父进程打开的文件描述符,  让父子进程看到同一个管道文件

然后只需关闭不需要的读写端即可

使用

        这个系统调用能让系统维护一个匿名管道,  匿名管道是由操作系统维护的一段缓冲区,  并不会创建文件

        pipefd为输出型参数,其本质是一个长度为2的数组,   pipifd[0]表示读端文件描述符, pipefd[1]表示写端文件描述符

        返回 0 表示开辟管道成功,  返回 -1 表示开辟管道失败,并且会设置错误码

比如父进程写入管道,  子进程读取管道数据

int main()
{
    int fd[2];
    pipe(fd);//创建匿名管道
    int rfd = fd[0];
    int wfd = fd[1];
    pid_t id = fork();//创建子进程
    if(id == 0)
    {
        close(wfd);//子进程关闭写文件描述符

        //这里就可以执行一些读取管道的方法
        
        exit(0);
    }
    close(rfd);//父进程关闭读文件描述符

    //这里执行一些写入管道的方法

    waitpid(id, NULL, 0);

    return 0;
}

命名管道

原理

让两个独立的进程打开同一个管道文件

使用

使用mkfifo创建一个命名管道文件

然后就可以让不同的进程打开读写端来完成进程间通信

二.System V

1.共享内存

原理

将一片内存通过页表映射到不同的进程的进程地址空间上

使用

使用ftok获取唯一性标识,  再使用shmget获取共享内存的id

size:  共享内存的大小,  共享内存在内核中以4KB为基本单位

flg常用选项:

  • IPC_CREAT:如果共享内存不存在,就创建之,如果共享内存已经存在,直接获取它
  • Ipc_EXCL:不能单独使用,没意义
  • IPC_CREATIPC_EXCL:如果共享内存不存在,就创建之,如果共享内存已经存在,出错返回

控制共享内存

cmd常用选择

  • IPC_STAT 获取共享内存的属性
  • IPC_RMID 删除指定共享内存

挂接和去关联共享内存

这一步实际就是将共享内存映射到进程的地址空间上

shmat 挂接指定共享内存, 返回一个指针指向共享内存的起始位置

shmid :  共享内存id

shmaddr :  可选指定位置挂接

shmflg常用选项

  • 0: 可读可写
  • SHM_RDONLY:  只读

shmdt  去关联,  传入已挂接的共享内存起始地址

2.消息队列

原理

一个进程向队列放数据块,  另一个进程拿取

使用

创建一个消息队列

msgflg常用选项

  • IPC_CREAT: 如果指定的key不存在,则创建一个新的消息队列,如果已经存在,则直接获得原先的消息队列
  • IPC_EXCL: 如果指定的key已经存在,则创建失败

控制消息队列

cmd常用选项

  • IPC_STAT:获取消息队列的状态信息
  • IPC_SET:设置消息队列的某些属性
  • IPC_RMID:删除消息队列

写入操作

msqid:消息队列的标识符
msgp:指向要写入的消息内容的指针
msgsz:要写入内容的字节数
msgflg常用选项

  • 0: 默认
  • IPC_NOWAIT: 如果消息队列已满,则立即返回

读取操作

msqid:消息队列的标识符

msgp:读到哪个缓冲区

msgsz:缓冲区大小

msgtyp: 指定要接收的消息类型

mesflg常用选项

  • 0: 默认
  • IPC_NOWAIT: 如果消息队列已满,则立即返回

3.信号量

原理

信号量是一种资源预定机制,  本质是个计数器

        进程访问资源前,要先申请一个信号量,用于预定资源,一旦预定成功,不管这个进程使不使用这个资源,  这个资源都不会再被分配给其他进程,  进程只有成功申请到了信号量才能访问这个资源

标签:IPC,文件,队列,间通信,管道,进程,共享内存
From: https://blog.csdn.net/2301_77838258/article/details/141107546

相关文章

  • 9 - Linux进程和计划任务管理
    目录一、进程1.程序和进程的关系2.查看进程信息2.1ps命令-查看进程信息2.2top命令-查看进程的动态信息2.3pgrep命令-查找进程信息2.4jobs命令-查看后台进程状态信息3.进程的启动方式4.进程的前后台调度5.中止进程的运行5.1Ctrl+C组合键5.2kill......
  • 详解linux后台、前台运行进程
    程序运行可以有2种前台运行程序运行在当前的终端,所有的信息都输出到屏幕上,占用你的终端,你也无法继续使用如果终端异常关闭,导致程序会自动退出后台运行不会占用你的终端,程序在系统后台跑着,你该干啥干啥,终端关了,程序也继续运行。后台运行命令命令集合command&#未启动......
  • 【IO】IPC通信机制函数(消息队列,共享内存,信号量集函数整理汇总)
            整理了一下IPC通信的函数,包括消息队列,共享内存,信号量集;信号量集的使用是在共享内存的基础上使用,函数太多啦,慢慢学吧cc,争取全部记住        其中在使用有关信号量集的函数的时候,进行简单的封装函数功能之后,再进行使用,会更加方便,在文章最后对信号量集的......
  • Linux 进程调度(二)之进程的上下文切换
    目录一、概述二、上下文切换的实现1、context_switch2、switch_mm3、switch_to三、观测进程上下文切换一、概述进程的上下文切换是指在多任务操作系统中,当操作系统决定要切换当前运行的进程时,将当前进程的状态保存起来,并恢复下一个要运行的进程的状态。上下文切换......
  • 多进程系列:计算各子进程时间
    多进程系列:计算各子进程时间了解各个子进程耗时对于负载均衡至关重要,下面展示代码示例和结果示例说明如何计算各子进程时间。代码示例importmultiprocessingimporttimefrompprintimportpprint#假设以下是五个分类模型函数defclassify_model_1(image_path,qu......
  • 多进程系列:不同的模型处理不同的数据
    多进程系列:不同的模型处理不同的数据代码示例importmultiprocessingimporttime#假设以下是五个分类模型函数defclassify_model_1(data):#模拟分类操作time.sleep(1)print("classify_model_1")returnf"模型1分类结果:{data}"defcl......
  • Linux进程管理
    Linux进程管理进程定义分配内存,已分配内存的地址空间安全属性,进程的运⾏身份和权限进程代码,运⾏⼀个或多个的线程进程状态,进程运⾏后的多种状态进程是已启动的可执行程序的运行实例。包含:分配内存、安全属性、进程代码、进程状态。静态程序:二进制文件(如/bin/ls,......
  • Java学习进程6
    大家好!这是我学习Java的第六周,今天我想和大家分享一下这一周我所做的事情、下周的计划、遇到的问题以及如何解决这些问题。本周学习内容在这一周,我继续深入学习Java语言的核心概念,特别是对面向对象编程(OOP)的理解。我复习了类和对象的定义,同时也对封装、继承和多态这三个重要概念......
  • IO进程----文件IO
    目录IO进程文件IO1. 概念2. 特点3. 函数3.1. 打开文件3.2. 关闭文件3.3. 读写文件readwrite3.4. 文件定位操作文件属性获取目录操作IO进程文件IO1. 概念在posix(可移植操作系统接口)中定义的一组输入输出的函数2. 特点1. 没......
  • Linux下自动监控进程运行状态
    目录背景应用举例1、使用crontab+脚本监控服务2、使用shell脚本监控服务2.1编写自定义监控脚本2.2运行脚本背景假设有一个服务需要长期运行,但可能会由于某种原因导致服务意外停止,不能及时发现,某天来到公司后发现出问题了才意识到服务挂了。此时再去手动重启服务......