Posix与System V IPC

一、Posix IPC

1.概述

三种类型的IPC合称为"Posix IPC":

  1. Posix消息队列;

  2. Posix信号量;

  3. Posix共享内存区;

在这里插入图片描述

2.IPC名字

三种类型的Posix IPC都使用"Posix IPC名字 ” 进行标识。mq_open、 sem_open和shm_open这三个函数的第一个参数就是这样的一 个名字,它可能是某个文件系统中的一 个真正的路径名,也可能不是。

Posix.1描述Posix IPC名字的:

  1. 必须符合已有的路径名规则(必须最多由PATH_MAX个字节构成,包括结尾的空字节)。

  2. 若以斜杠符开头,那么对这些函数的不同调用将访问同 一 个队列。如果它不以斜杠符开头,那么效果取决于实现。

  3. 名字中额外的斜杠符的解释由实现定义。

由于移植性问题不能都兼容到,应该把Posix IPC名字的#define行放在一个便于修改的头文件中,这样程序转移到另一个系统上,只需修改头文件。Posix.1定义了三个宏:

S_TYPEISMQ(buf);
S_TYPEISSEM(buf);
S_TYPEISSHM(buf);
  1. 参数buf是指向某个stat结构的指针,其内容由fstat、lstat或stat这三个函数填入。
  2. 若所指定的lPC对象(消息队列、信号囊或共享内存区对象)是作为一种独特的文件类型实现的,而且参数所指向的stat结构访问这样的文件类型,那么这三个宏计算出 一 个非零值。否则,计算出的值为0。
  3. 项目3

3.px_ipc_name函数

自定义px_ipc_name函数解决移植性问题的方法,定位Posix IPC名字而添加上之前的前缀目录。

char *px_ipc_name(const char *name);
//name不能有任何斜杠符,例:
px_ipc_name("test");

函数原型:

char * px_ipc_name(const char *name)
{
   
	char	*dir, *dst, *slash;

	if ( (dst = malloc(PATH_MAX)) == NULL)
		return(NULL);

	//可以使用环境变量覆盖默认目录
	if ( (dir = getenv("PX_IPC_NAME")) == NULL) {
   
#ifdef	POSIX_IPC_PREFIX
		dir = POSIX_IPC_PREFIX;		/* 来自“config.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值