msgget用于创建一个新队列或打开一个现存的队列。msgsnd将新消息加入到消息队列中;每个
消息包括一个long型的type;和消息缓存;msgrcv用于从队列中取出消息;取消息很智能,不一定先进先出
①msgget,创建一个新队列或打开一个现有队列
#include
int msgget ( key_t key, int flag );
//成功返回消息队列ID;错误返回-1
②msgsnd: 发送消息
#include
int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag )
//成功返回0,错误返回-1
a:
flag可以指定为IPC_NOWAIT
若消息队列已满,则msgsnd立即出错返回EABAIN;
若没指定IPC_NOWAIT; msgsnd会阻塞,直到消息队列有空间为止
③msgrcv: 读取消息:
ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag )
a. type == 0返回消息队列中第一个消息,先进先出
b. type >0
返回消息队列中类型为tpye的第一个消息
c. type <0
返回消息队列中类型 <=
|type| 的数据;若这种消息有若干个,则取类型值最小的消息
消息队列创建步骤:
#define
MSG_FILE "."
struct msgtype {
long mtype
char buffer[BUFFER+1]
}
if((key=ftok(MSG_FILE,'a'))==-1)
{
fprintf(stderr,"Creat Key Error:%s\n", strerror(errno))
exit
(1)
}
if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)
{
fprintf(stderr,"Creat Message
Error:%s\n", strerror(errno))
exit
(1)
}
26203就是你这个程序运行时候的 PID 阿,你在发消息之前,不是把当前进程的PID存放到消息里的 mtype 了吗p->mtype = getpid()
然后接收方收到这个消息,又把 mtype 打印出来了阿
printf("Message received from %ld\n%s\n" , p->mtype , p->mdata )
这个就是打印从 PID 收到了消息,消息是 p->mdata里的内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)