2012-1-6
IPC对象:共享内存、消息队列、信号量(信号灯集)
key :IPC_PRIVATE和ftok的返回值。。。。。 常用: key = IPC_PRIVATE 只能自己或者具有血缘关系的使用
1.ftok()函数:
key_t ftork(“路径”, id)
路径使用自己的工作目录,避免了key冲突。 id 任意指定一个字母,即key由路径+id组成。。。。
2.共享内存
特点一:效率最高的一种进程间通信。。。。(数据吞吐量大时才能体现出优势)
共享内存必须依靠同步机制使用
共享内存的使用步骤:
创建共享内存 必须判断 EEXIST IPC_CREAT|0666 ----权限
shmget(key, size,IPC_CREAT|0666)返回一个shmid号 system(ipcs -m)查看 ipcrm –m 删除
映射共享内存
使用完取消共享内存映射
删除共享内存对象 IPC_RMID(删除对象)(所有进程都不使用这个共享内存时,则最后一个使用它的进程,删除IPC对象)
同步---通信
A:从终端读一个数据
开始
创建共享内存(成功则往下执行)(IPC_EXCL判断)失败则打开
映射
先写入 pid(填充结构体)
等待信号(pause())
被唤醒后读终端
发信号唤醒B
B:开始
打开共享内存
映射
读对方的id,写自己的id
发信号----唤醒A
等待pause()
打印完---发信号
在等待
IPC 消息队列
struct msgbuf
{
long mtype; 消息类型
char mtex [N]; 消息正文
};
创建:int msgget(key, 权限) 权限:IPC_CREAT|0666 成功返回消息队列的ID,错误返回-1
添加:int msgsnd(msgid, &mybuf, sizeof(struct addrbuf)- sizeof(long), 0)
读取:int msgrcv(msgid, &mybuf,BUFSIZE, mybuff。type, 0)
删除:int msgctl (msgid, IPC_RMID, 0)