key_t ftok(const char *pathname, int proj_id);
共享内存:(效率最高的进程通信方式)
1,创建/打开共享内存
int shmget(key_t key, int size, int shmflg);
key:ftok()返回值,或者IPC_PRIVATE
size:大小
shmflg:权限,IPC_CREATE|0666, IPC_EXCL:如果存在,创建失败
查看:ipcs
删除ipc:ipcrm -mqs id
2,映射共享内存,
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid:shmget的返回值
shmaddr:一般为空,由系统分配
shmflg:SHM_RDONLY(只读),默认为0,可读写
3,撤销共享内存映射
int shmdt(const void *shmaddr);
4,删除共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
cmd:IPC_STAT:获取对象属性
IPC_SET:设置对象属性
IPC_RMID:删除对象
buf:用于保存对象属性,若第二个参数为IPC_RMID,则可以为NULL
消息队列:
1,创建:
int msgget(key_t key, int msgflg);
key:ftok()返回值
msgflg:权限,同shmget的shmflg类似
返回msg的id,出错返回-1
2,写消息:
int msgsnd(int msgid, const void *msgp, size_t size, int flag);
msgid:msgget()的返回值
struct msggbuf{
long mtype;//必须的
char mtext[N];
};
size:消息正文的内容
flag:IPC_NOWAIT:消息没有发送完成(如消息队列满,无法写入),也会立即返回
0:阻塞操作,直到消息发送成功
3,读消息:
int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag);
msgtype:0:消息队列中的第一个消息
大于0:消息中第一个该类型的消息
小于0:消息队列中第一个类型值不小于fabs(msgtype)的消息
flag:IPC_NOWAIT:不阻塞,若没有消息,进程立即返回ENOMSG
0:阻塞,直到读到所需要的消息,失败返回-1
4,销毁消息队列:
int msgctl(int msgid, int cmd, struct msgid_ds *buf);
阅读(1264) | 评论(0) | 转发(0) |