【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - System V进程间通信基础


【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - System V进程间通信基础


System V IPC基础

可以使用ipcs查看当前系统正在使用的IPC工具。可以看出,一个IPC工具至少包含key值、ID值、拥有着、权限和使用大小等关键信息。如需手动删除某个IPC机制,可以使用ipcrm命令。

任何一个IPC对象,都和普通文件一样,具有创建者、创建者组、拥有着和拥有着组。


key值和ID值

Linux系统为每个IPC机制都分配了唯一的ID,所有针对该IPC机制的操作都使用对应的ID。因此,通信的双方都需要通过某个办法来获取ID值。显然,创建者根据创建函数的返回值可获取该值,但另一个进程如何实现呢?显然,Linux两个进程不能随意访问对方的空间(一个特殊是,子进程可以继承父亲进程的数据,实现父亲进程向子进程的单向传递),也就不能够直接获取这一ID值。
为解决这一问题,IPC在实现时约定使用key值做为参数创建,如果在创建时使用相同的key值将得到同一个IPC对象的ID(即一方创建,另一方获取的是ID),这样就保证了双方可以获取用于传递数据的IPC机制ID值。key值是一个32为的整型数据。 

ftok()用来创建key值



ftok使用示例:

#include<sys/ipc.h>
#include<stdio.h>
#include<sys/stat.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	key_t key;
	int i;
	struct stat buf;
	if(argc!=3)
	{
		printf("use: command path number\n");
		return 1;
	}

	i=atoi(argv[2]);
	if((stat(argv[1],&buf))==-1)
	{
		perror("stat");
		exit(EXIT_FAILURE);
	}
	printf("file st_dev=0x%x\n",buf.st_dev);
	printf("file st_ino=0x%x\n",buf.st_ino);
	printf("number=0x%x\n",i);
	key=ftok(argv[1],i);	

	printf("key=0x%x \tkey>>24=%x \tkey&0xffff=%x \t(key>>16)&0xff=%x\n",key,key>>24,key&0xffff,(key>>16)&0xff);
}
运行结果:

$ ./ftok_exp ../ 4
file st_dev=0x801
file st_ino=0xe0560
number=0x4
key=0x4010560 	key>>24=4 	key&0xffff=560 	(key>>16)&0xff=1

拥有着权限存储结构struct ipc_perm

系统使用ipc_perm 结构来保存每个IPC 对象权限信息。在Linux 的库文件linux/ipc.h
中,它是这样定义的:
struct ipc_perm
{
key_t key;
ushort uid; /* owner euid and egid */
ushort gid;
ushort cuid; /* creator euid and egid */
ushort cgid;
ushort mode; /* access modes see mode flags below */
ushort seq; /* slot usage sequence number */
};
结构里的前几个成员的含义是明显的,分别是IPC 对象的关键字,uid 和gid。然后是
IPC 对象的创建者的 uid 和gid。接下来的是IPC 对象的存取权限。最后一个成员也许有点
难于理解,不过不要担心,这是系统保存的IPC 对象的使用频率信息,我们完全可以不去
理会它。

原文链接:

http://blog.csdn.net/geng823/article/details/41009975


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux高级程序设计》是由杨宗德和吕光宏合著的一本经典编程书籍。该书具有以下特点和价值: 首先,该书全面而深入地介绍了Linux高级编程概念和技术,涵盖了Linux系统编程的方方面面。读者可以从中学习到Linux程序设计的基本知识,如进程管理、线程编程、文件操作、内存管理等,同时也可以学习到高级技术,如网络编程、信号处理、套接字编程等。 其次,该书注重实践与理论的结合,通过丰富的代码示例和实际案例,帮助读者加深对Linux编程的理解和应用。这些示例和案例设计合理,代码规范,可以帮助读者快速掌握各种编程技术,并提供了实际项目开发经验。 再次,该书系统性强,内容全面而深入。从系统调用、文件系统到网络编程、进程间通信,从基础知识到高级技术,涵盖了Linux程序设计的方方面面。由浅入深的组织结构和清晰的逻辑思路,使得读者可以循序渐进地学习,并可以根据自身需求选择阅读的内容。 最后,该书是一本经典且广泛应用于教育和实践的优秀教材。它以其权威性和实用性备受好评,成为许多大学和学院的Linux编程教材。除此之外,该书也适合有一定编程基础的工程师和开发人员自学。 总之,杨宗德和吕光宏的《Linux高级程序设计》是一本经典而实用的Linux编程教材,内容丰富、全面,适合初学者和有一定基础的程序员学习和参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值