POSIX(Portable Operation System Interface)可移植操作系统接口(具体实现依据平台 )标准。目的是为了提升应用程序的各种UNIX系统环境之间的可移植性。就是为了让系统函数调用采用相同的原型标准编写。
Signal UNIX Specification是POSIX.1的一个超集,定义了一些附加接口,扩展了POSIX
SVR4(UNIX System V Release 4)是 AT公司定义的标准,符合POSIX和其他标准。
Posix IPC
Posix IPC都是通过名字进行标识。名字就是路径
System V IPC
ftok函数
System V IPC都使用key_t值作为名字,也叫做IPC键。键值可以通过fork函数创建,也可以通过IPC_PRIVATE宏定义保证创建新的唯一的IPC对象。
/*
通过导出pathname信息和id低8位组合IPC键,并返回。
pathname:获得该目录文件系统信息(st_dev和st_ino)
id:一个输入参数
返回:成功IPC键,错误-1,若pathname不存在或者进程不可访问则返回出错。
*/
key_t ftok (const char *__pathname, int __proj_id)
int main(int argc , char *argv[])
{
struct stat stat1;
const char *pathname = "/home/wangjun";
stat(pathname , &stat1);
printf("st_dev:%lx , st_ino:%lx , key:%x \n",(unsigned long)stat1.st_dev ,
(unsigned long)stat1.st_ino , Ftok("/home/wangjun" , 0x57));
exit(0);
}
st_dev:801 , st_ino:cd424 , key:5701d424
按 来关闭窗口…
可以看出fork返回通过dev低八位,ino低12位,再加上id组合成IPC键。
XXget函数
所有的XXget函数都含有两个参数,key_t和flag参数。
其中flag作用:创建或打开标识时候,设置对象权限以及返回属性。
/* Data structure used to pass permission information to IPC operations. */
struct ipc_perm
{
__key_t __key; /* Key. */
__uid_t uid; /* Owner's user ID. */
__gid_t gid; /* Owner's group ID. */
__uid_t cuid; /* Creator's user ID. */
__gid_t cgid; /* Creator's group ID. */
unsigned short int mode; /* Read/write permission. */
unsigned short int __pad1;
unsigned short int __seq; /* Sequence number. */
unsigned short int __pad2;
__syscall_ulong_t __glibc_reserved1;
__syscall_ulong_t __glibc_reserved2;
};
int msgget (key_t __key, int __msgflg);
int semget (key_t __key, int __nsems, int __semflg);
int shmget (key_t __key, size_t __size, int __shmflg);
/*
系统为每一个IPC对象维护ipc_perm信息结构,用来存储IPC对象权限信息。
创建IPC时候,通过上述__key指定IPC访问的标识符,通过flg来指定权限用来初始化ipc_perm结构mode成员。
*/
IPC权限oflag设置:
对于创建或者时候打开oflag设置:
标识符重用
System V IPC 标识符是系统范围的,不是特定于进程的。ipc_perm结构含有一个名为seq的变量,是内核为系统每个潜在的IPC对象维护的计数器,每当删除一个IPC对象时,内核就递增相应的槽位号,若溢出则循环到0。这样避免短时间内重用System V IPC标识符,有助于确保过早终止的服务器重新启动后不会重用标识符。写个程序测试输出有megget返回的前10个标识符值。为了放置标识符在一段时间内重复被使用。
int main(int argc , char *argv[])
{
int i , msqid;
for(i = 0 ; i<10 ; ++i){
msqid = Msgget(IPC_PRIVATE , SVMSG_MODE|IPC_CREAT);//宏定义,产生唯一key,模式和创建flag
printf("msqid = %d\n" , msqid);
Msgctl(msqid , IPC_RMID , NULL);//利用包裹函数删除队列标识符
}
exit(0);
}
msqid = 0
msqid = 32768
msqid = 65536
msqid = 98304
msqid = 131072
msqid = 163840
msqid = 196608
msqid = 229376
msqid = 262144
msqid = 294912
ipcs和ipcrm程序
ipcs -a 是默认的输出信息 打印出当前系统中所有的进程间通信方式的信息
ipcs -m 打印出使用共享内存进行进程间通信的信息
ipcs -q 打印出使用消息队列进行进程间通信的信息
ipcs -s 打印出使用信号进行进程间通信的信息
ipcs -t 输出信息的详细变化时间
ipcs -p 输出ipc方式的进程ID
ipcs -c 输出ipc方式的创建者/拥有者
ipcs -u 输出当前系统下ipc各种方式的状态信息(共享内存,消息队列,信号)
ipcrm -M shmkey 移除用shmkey创建的共享内存段
ipcrm -m shmid 移除用shmid标识的共享内存段
ipcrm -Q msgkey 移除用msqkey创建的消息队列
ipcrm -q msqid 移除用msqid标识的消息队列
ipcrm -S semkey 移除用semkey创建的信号
ipcrm -s semid 移除用semid标识的信号