IPC—进程间的通信(信号量,共享内存,消息队列)

IPC是进程间的通信(interprocess communication)的简称。传统上该术语描述的是运行在某个操作系统上的不同的进程间各种消息传递(message passing)。
IPC分为两代,初代System V IPC比较全面,现在用的Posix IPC更加易懂。不管是哪代IPC,重点都是这3点:
1. 信号量
2. 共享内存
3. 消息队列
Linux下命令行输入 ipcs 可查看信息量,共享内存和消息队列。

—,信号量
信号量是一个特殊的整数值,主要是用来控制多个进程对临界资源的互斥访问,进程根据信号量来判断是否有可供利用的资源。信号量主要是用来实现进程同步机制
信号量是一个计数器,可用于同步多进程对共享数据对象的访问,为了获得共享资源,进程需要执行以下操作:
1,测试控制该资源的信号量操作后的值。
2,若此操作后的信号量值大于等于0,则进程可以使用该资源,进程将信号量值减1,表示它使用了一个资源单位。
3,若此操作后的信号量为小于0的值,则表示没有资源可用,该进程将被阻塞,当信号量大于0时,进程才会得到资源继续运行。

当进程不再使用由一个信号量控制得共享资源时,该信号量值增1。如果有进程正在睡眠以等待此信号量,则唤醒他们,为了正确地实现信号量,信号量值得测试及减1操作应当是原子操作,为此,信号量通常是在内核中实现得。
常用的信号量一般初始值为1,只控制单个资源,有时也称互斥锁,但是,信号量得初值可以是任意一正值,该值说明有多少个共享资源单位可供共享应用,信号量有以下3个特性:
1、信号量并非是一个非负值,而必须将信号量定义为含有一个或多个信号量值的集合,当创建一个信号量时,要指定该集合中的各个值。(linux/sem.h struct semid_ds)
sreuct sem
{
ushort_t semvl;
short sempid;
ushort semncnt;
ushort semzcnt;
};
2、创建信号量对其赋初值分开,这是一个致命弱点,因为不能原子地创建一个信号量集合,并且对该集合中的所有值赋初值。
3、即使没有进程使用,但他们仍然存在,因此必须考虑在进程终止时有没有释放得信号量。
以上的三个特性就导致了信号使用的复杂性。

Linux中,信号量的主要操作函数主要有以下:

key_t ftok(char *pathname, char proj);

根据参数pathname和proj 来创建一个关键字,成功时返回与路径pathname相对应的一个键值,具有唯一性,失败时返回值为-1。

int semget(key_t key, int nsems, int semflg);

创建一个新信号量或者取得一个现有的信号量,key是一个关键字,可以是用ftok()函数创建的,也可以是IPC_PRIVATE(/usr/include/bits$ vi ipc.h),nsems表明创建的信号量个数,semflg是设置信号量的访问权限标志,函数调用成功时返回信号量ID,失败则返回-1。

int semop (int semid, struct sembuf *spos, int nspos);

对信号量进行操作的函数,用于改变信号量的键值,semid是信号量的标志,spos是指向一个结构体数组的指针,表明要进行什么操作,nspos表明数组的元素个数,调用成功则返回0,失败则返回-1.

int semctl (int semid, int semnum, int cmd,  union semun arg);

该函数得作用是对信号量进行一系列得控制,semid是要操作得信号量标志,semnum是信号量得下标,cmd是操作的命令,经常用的两个命令是:SETVAL、IPC_RMID,arg用于设置或返回信号量信息。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值