Linux || 进程通信(IPC)

2021/11/15 7:10:12

本文主要是介绍Linux || 进程通信(IPC),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 进程间通信
    • 管道
      • 1. 有名管道
      • 2. 无名管道
    • 信号量
    • 共享内存
      • 原理
      • 有关函数
    • 消息队列
      • 相关函数

进程间通信

进程间通信方式:管道 信号量 套接字 共享内存 消息队列

管道

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

1.打开管道 在内存中分配空间

2.向管道写数据 实际是写到内存中

3.读取 从内存中读

4.大小为0

5.写端关闭 读端read()返回0

读端关闭 写端写入数据产生异常 收到异常信号SIGPIPE

6.管道属于半双工 同一时间内数据只能向一个方向传输

1. 有名管道

可以在任意两个进程之间通信

int mkfifo(const char* filename,mode_t mode);   //管道名 权限

创建: 1. 命令创建: mkfifo

​ 2. 系统调用创建

2. 无名管道

主要是用于在父子进程之间通信

int pipe(int fd[2]);//成功返回0 失败返回-1
fd[0] //管道读端描述符
fd[1] //管道写端描述符

信号量

信号量一般取正数值,它的值代表允许访问的资源数目,信号量主要用于同步进程

获取资源时,需要对信号量的值进行原子减一,P操作,当信号量值为0时,代表没有资源可用,P操作会阻塞
释放资源时,需要对信号量的值进行原子加一,V操作
信号量的值如果只取0,1,将其称为二值信号量
信号量的值大于1,称之为计数信号量

临界资源:同一时刻,只允许被一个进程或线程访问的资源
临界区:访问临界资源的代码段

共享内存

为多个进程之间共享和传递数据提供了一种有效方式

原理

  • 先在物理内存上申请一块空间
  • 多个进程可以将其映射到自己的虚拟地址空间中,所有进程都可以访问共享内存中的地址
  • 如果某个进程向共享内存写入了数据,所做的改动会立刻被可以访问同一段共享内存的任何其他进程看到

在这里插入图片描述

有关函数

#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
int shmget(key_t key,size_t size,int shmfig);
//成功返回共享内存的ID,失败返回-1
int shmdt(const void * shmaddr);
//断开当前进程的shmaddr指向 的共享内存映射
int shmctl(int shmid,int cmd,struct shmid_ds * buff);
//控制共享内存

消息队列

在这里插入图片描述
消息队列是一个消息的链表,有写权限的进程可以向消息队列中添加新消息,有读权限的进程可以从消息队列中独奏消息

相关函数

  1. 创建或获取一个消息队列
    msqflg : IPC_CREAT
int msgget(key_t key,int msqflg);
  1. 发送一条消息,成功返回0,失败返回-1
    msqsz:指定mtext中有效数据的长度
    msqflg:一般设置为0 IPC_NOWAIT
int msgsnd(int msqid,const void * msqp,size_t msqsz,int msqflg);
  1. 接收一条消息,成功返回mtext中接收到的数据长度,失败返回-1
    msqtyp:指定接收的消息类型 0
    msqflg:一般设置为0 IPC_NOWAIT
ssize_t msqrcv(int msqid,void * msqp,size_t msqsz,long msqtyp,int msqflg
);
  1. 控制消息队列,成功返回0
    cmd:IPC_RMID
int msqctl(int msqid,int cmd,struct msqid_ds * buff);


这篇关于Linux || 进程通信(IPC)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程