加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

System V IPC 之消息队列

发布时间:2020-12-13 14:11:47 所属栏目:Linux 来源:网络整理
导读:msg * msg * msg_perm :对应于该消息队列的 ipc_perm 结构指针。 msg_first :msg 结构指针,msg 结构用于表示一个消息,此指针指向消息队列中的第一个消息。 msg_last :msg 结构指针,指向消息队列中的最后一个消息。 msg_ctypes :记录消息队列中当前的

msg * msg *

msg_perm:对应于该消息队列的 ipc_perm 结构指针。msg_first:msg 结构指针,msg 结构用于表示一个消息,此指针指向消息队列中的第一个消息。msg_last:msg 结构指针,指向消息队列中的最后一个消息。msg_ctypes:记录消息队列中当前的总字节数。msg_qnum:记录消息队列中当前的总消息数。msg_qbytes:记录消息队列中最大可容纳的字节数。msg_lspid:最近一个执行 msgsnd 函数的进程的 PID。msg_lrpid:最近一个执行 msgrcv 函数的进程的 PID。msg_stime:最近一次执行 msgsnd 函数的时间。msg_rtime:最近一次执行 msgrcv 函数的时间。msg_ctime:最近一次改变该消息队列的时间。

msgtext[

#include

<span style="color: #0000ff">int msgget(key_t key,<span style="color: #0000ff">int msgflg);

#include

<span style="color: #0000ff">int msgsnd(<span style="color: #0000ff">int msqid,<span style="color: #0000ff">const <span style="color: #0000ff">void *msgp,size_t msgsz,<span style="color: #0000ff">int msgflg);

#include ssize_t msgrcv(<span style="color: #0000ff">int msqid,<span style="color: #0000ff">void *msgp,<span style="color: #0000ff">long msgtyp,<span style="color: #0000ff">int msgflg);

msgtyp=0??? 接收消息队列中的第一条消息msgtyp>0??? 接收消息队列中类型值等于 msgtyp 的第一条消息msgtyp<0??? 接收消息队列中类型值小于等于 msgtyp 的绝对值的所有消息类型值最小的消息中的第一条消息IPC_NOWAIT:指定 msgtyp 无效时的处理方法。当 msgtyp 无效时,如果 IPC_NOWAIT 被设置,则立即出错返回,否则接收消息的进程将被阻塞,直至 msgtyp 有效或该消息队列被删除。MSG_NOERROR:用于设置消息长度大于 msgsz 时的处理方法。当消息长度大于 msgsz 时,如果 MSG_NOERROR 位被设置,则接收该消息,超出部分被截断,函数正确返回,否则不接收该消息而将其保留在消息队列中,出错返回。

#include

<span style="color: #0000ff">int msgctl(<span style="color: #0000ff">int msqid,<span style="color: #0000ff">int cmd,<span style="color: #0000ff">struct msqid_ds *buf);

IPC_RMID:删除消息队列。此命令是立即执行的,如果还有进程对此消息队列进行操作,则出错返回。只有有效用户 ID 和消息队列的所有者 ID 或创建者 ID 相同的用户进程,以及超级用户进程可以执行这一操作。IPC_SET:按参数 buf 指向的结构中的值设置该消息队列对应的 msqid_ds 结构。只有有效用户 ID 和消息队列的所有者 ID 或创建者 ID 相同的用户进程,以及超级用户进程可以执行这一操作。IPC_STAT:获得该消息队列的 msqid_ds 结构,保存于 buf 指向的缓冲区。

#include <.h>

<span style="color: #0000ff">int main(<span style="color: #0000ff">void<span style="color: #000000">)
{
<span style="color: #0000ff">int<span style="color: #000000"> msgid;
<span style="color: #0000ff">int<span style="color: #000000"> status;
<span style="color: #0000ff">char str1[ ]={<span style="color: #800000">"<span style="color: #800000">test message:hello!<span style="color: #800000">"<span style="color: #000000">};
<span style="color: #0000ff">char str2[ ]={<span style="color: #800000">"<span style="color: #800000">test message:godbye!<span style="color: #800000">"<span style="color: #000000">};
<span style="color: #0000ff">struct<span style="color: #000000"> msgbuf
{
<span style="color: #0000ff">long<span style="color: #000000"> msgtype;
<span style="color: #0000ff">char msgtext[<span style="color: #800080">1024<span style="color: #000000">];
}sndmsg,rcvmsg;

</span><span style="color: #0000ff"&gt;if</span>((msgid=msgget(IPC_PRIVATE,<span style="color: #800080"&gt;0666</span>))==-<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;)
{
    printf(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;msgget error!n</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    exit(</span><span style="color: #800080"&gt;254</span><span style="color: #000000"&gt;);
}
sndmsg.msgtype </span>= <span style="color: #800080"&gt;111</span><span style="color: #000000"&gt;;
sprintf(sndmsg.msgtext,</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;%s</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;,str1);
</span><span style="color: #0000ff"&gt;if</span>(msgsnd(msgid,(<span style="color: #0000ff"&gt;struct</span> msgbuf *)&amp;sndmsg,<span style="color: #0000ff"&gt;sizeof</span>(str1)+<span style="color: #800080"&gt;1</span>,<span style="color: #800080"&gt;0</span>)==-<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;)
{
    printf(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;msgsnd error!n</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    exit(</span><span style="color: #800080"&gt;254</span><span style="color: #000000"&gt;);
}
sndmsg.msgtype </span>= <span style="color: #800080"&gt;222</span><span style="color: #000000"&gt;;
sprintf(sndmsg.msgtext,str2);
</span><span style="color: #0000ff"&gt;if</span>(msgsnd(msgid,<span style="color: #0000ff"&gt;sizeof</span>(str2)+<span style="color: #800080"&gt;1</span>,<span style="color: #800080"&gt;0</span>)==-<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;)
{
    printf(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;msgsnd error!n</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    exit(</span><span style="color: #800080"&gt;254</span><span style="color: #000000"&gt;);
}
</span><span style="color: #0000ff"&gt;if</span>((status=msgrcv(msgid,(<span style="color: #0000ff"&gt;struct</span> msgbuf *)&amp;rcvmsg,<span style="color: #800080"&gt;80</span>,<span style="color: #800080"&gt;222</span>,IPC_NOWAIT))==-<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;)
{
    printf(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;msg rcv error!n</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    exit(</span><span style="color: #800080"&gt;254</span><span style="color: #000000"&gt;);
}

printf(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;The received message: %s.n</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;,rcvmsg.msgtext);
</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 下面的代码会删除消息队列,这里把它注释掉是为了使用 ipcs 命令进行观察
</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; msgctl(msgid,IPC_RMID,0);</span>
exit(<span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;);

}

$ -Wall msgqueue.c -o msgqueue_demo

$ ./msgqueue_demo

$ ipcs -q

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读