15章先导篇 Posix/System V IPC共性

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标识的信号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有时需要偏执狂

请我喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值