Linux 进程间通信(一)

本文详细介绍了进程间通信(IPC)的多种方式,包括统一主机间的无名通道、有名通道、信号、System V的信号量、消息队列及共享内存等,并提供了相关API函数及其用法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源。但是,进程不是孤立的,不同的进程之间需要信息的交换以及状态的传递,因此需要进程间数据传递、同步与异步的机制。

分类

  • 统一主机间进程通信
    • Unix进程间通信方式
      • 无名通道
      • 有名通道
      • 信号
    • System V进程间通信方式
      • 信号量
      • 消息队列
      • 共享内存
  • 不同主机间进程通信
      • RPC
      • Socket

消息队列IPC

简单介绍下,所有相关的API函数:

API函数用途
msgget  创建一个新的消息队列       
 获取消息队列ID
msgsnd       向消息队列发送消息
msgrcv从消息队列接受消息
msgctl获得消息队列的信息
 设置消息队列的信息
 删除消息队列

函数原型如下:

复制代码
// 函数原型
#include <sys/msg.h>
 
int msgget( key_t key, int msgflag);
/*
key为消息队列的描述符
msgflag是一个设置选项,可以设置权限

返回值为消息队列ID
*/

int msgctl( int msgid, int cmd, struct msqid_ds *buf);
/*
msgid是msgget的返回值
cmd :IPC_STAT 获取消息队列当前的状态信息,保存到buf指向的空间
             IPC_SET  设置消息队列的属性
             IPC_RMID 从内核中删除msgid标识的消息队列
*/

int msgsnd( int msgid, struct msgbuf *msgp, size_t msgsz, int msgflag);
/*
msgid为消息队列ID
msgbuf 指向要发送的消息
msgsize 消息的大小
msgflag 操作标志位
*/

int msgrcv(int msgid, struct msgbuf *msgbuf, size_t msgsize, long int msgtype, int msgflag);
/*
msgtype用来指定要接收的消息,分三种情况:
等于 0 返回消息队列中的第一个消息
大于0  返回消息队列中类型为msgtype的第一个消息
小于0 返回消息队列中类型值小于等于msgtype绝对值的消息中类型值最小的第一条消息
*/
复制代码

例子:

 创建消息队列
 配置消息队列
 向消息队列发送消息
 从消息队列读取消息

共享内存

  使用消息队列时,一个进程要向队列中写入消息,这要引起从用户地址空间的一次复制,当另外一个进程要从消息队列中读取消息时,又要进行一次从内核空间向用户空间的一次复制。而共享内存的优点就是完全省去了这些复制操作。

  简单介绍下API函数:

API函数用途                                                                                             
shmget            创建一个新的共享内存区段
 取得一个已经创建的共享内存区段的描述符
shmctl取得一个共享内存区段的信息
 为一个共享内存区段设置特定的信息
 删除一个共享内存区段
shmat挂接一个共享内存区段
shmdt与一个共享内存区段分离

   函数原型如下:

复制代码
//函数原型
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>

int shmget( key_t key, size_t size, int shmflag );
/*
key为描述符
size为共享内存区段的大小
shmflag为指令和权限设置
*/

int shmctl( int shmid, int cmd, struct shmid_ds *buf );
/*
shmid指共享内存ID
cmd为指令
*/

void *shmat( int shmid, const void *shmaddr, int shmflag);
/*
shmaddr指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置
shmflg SHM_RDONLY:为只读模式,其他为读写模式
*/

int shmdt( const void *shmaddr );
复制代码

例子:

 创建共享内存
 取得共享内存
 写入共享内存
 读取共享内存
 删除共享内存

 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/3213738.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值