UNIX 网络编程
约 618 字大约 2 分钟
2026-01-28
进程间通信
进程间通信主要有以下几个发展阶段:
管道
System V消息队列
Posix消息队列
Rempte Procedure Call (远程系统调用)
System V信号量
Posix 信号量

要确认管道自身是什么持续性

名字空间对于普通管道以外的所有IPC来说,名字是客户与服务器约定以交换信息的手段.
fork、exit、exec等函数执行后对IPC的影响.
Posix IPC
- 消息队列
- 信号量
- 共享内存区

上述是一个打开一个IPC对象的逻辑
会有一些权限测试
如果当前进程的有效用户ID为0,允许访问;
在当前进程的有效用户ID等于该IPC对象的主ID前提下,如果相应的用户权限位已设置,允许访问,否则拒绝访问;
在当前进程的有效组ID或它的某个辅助组ID等于IPC对象的组ID的前提下,如果相应的组访问权限位已设置,就可以访问,否则拒绝访问
如果相应的用户访问权限已经设置,那么就允许访问,否则拒绝访问
System V IPC
#include <sys/ipc.h>
key_t ftok(const char *pathname, int id);
// 这个函数从pathname导出的信息与id的低序8位组合成一个整数IPC键注
int main(int argc, char **argv)
{
struct stat stat;
if (argc != 2) {
}
stat(argv[1], &stat);
ftok((argvp[1], 0x57));
exit(0);
}
// ftok转换的IPC键通过pathname和id转换
// id 键在IPC键的高8位, stat.st_dev(这个的低序12位在接下来12位), stat.st_info(这个的低12位在IPC键的低12位)
//键的组成方法可以有区别struct ipc_perm {
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
mode_t mode;
ulong_t seq;
key_t key;
};
// 指定key为IPC_PRIVATE能保证创建一个唯一的IPC对象,没有一对id和pathname组合就会ftok产生IPC_PRIVATE
// 设置oflag参数IPC_CREATE但不设置IPC_EXCL位时,如果所指定的键的IPC对象不存在,那就创建一个新的对象,否则返回该对象
// 同时设置oflag的IPC_CREAT和IPC_EXCL时,如果指定的IPC对象不存在那么创建一个新的对象,否则返回一个EEXIST错误(因为对象已经存在)
ipcs 和ipcrm
