Linux多线程同步之消息队列有何特点

Linux多线程同步之消息队列有何特点,第1张

消息队列消息的链表,存放在内核中并有消息队列标示符标示。

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里的内容。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8300110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存