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">if</span>((msgid=msgget(IPC_PRIVATE,<span style="color: #800080">0666</span>))==-<span style="color: #800080">1</span><span style="color: #000000">)
{
printf(</span><span style="color: #800000">"</span><span style="color: #800000">msgget error!n</span><span style="color: #800000">"</span><span style="color: #000000">);
exit(</span><span style="color: #800080">254</span><span style="color: #000000">);
}
sndmsg.msgtype </span>= <span style="color: #800080">111</span><span style="color: #000000">;
sprintf(sndmsg.msgtext,</span><span style="color: #800000">"</span><span style="color: #800000">%s</span><span style="color: #800000">"</span><span style="color: #000000">,str1);
</span><span style="color: #0000ff">if</span>(msgsnd(msgid,(<span style="color: #0000ff">struct</span> msgbuf *)&sndmsg,<span style="color: #0000ff">sizeof</span>(str1)+<span style="color: #800080">1</span>,<span style="color: #800080">0</span>)==-<span style="color: #800080">1</span><span style="color: #000000">)
{
printf(</span><span style="color: #800000">"</span><span style="color: #800000">msgsnd error!n</span><span style="color: #800000">"</span><span style="color: #000000">);
exit(</span><span style="color: #800080">254</span><span style="color: #000000">);
}
sndmsg.msgtype </span>= <span style="color: #800080">222</span><span style="color: #000000">;
sprintf(sndmsg.msgtext,str2);
</span><span style="color: #0000ff">if</span>(msgsnd(msgid,<span style="color: #0000ff">sizeof</span>(str2)+<span style="color: #800080">1</span>,<span style="color: #800080">0</span>)==-<span style="color: #800080">1</span><span style="color: #000000">)
{
printf(</span><span style="color: #800000">"</span><span style="color: #800000">msgsnd error!n</span><span style="color: #800000">"</span><span style="color: #000000">);
exit(</span><span style="color: #800080">254</span><span style="color: #000000">);
}
</span><span style="color: #0000ff">if</span>((status=msgrcv(msgid,(<span style="color: #0000ff">struct</span> msgbuf *)&rcvmsg,<span style="color: #800080">80</span>,<span style="color: #800080">222</span>,IPC_NOWAIT))==-<span style="color: #800080">1</span><span style="color: #000000">)
{
printf(</span><span style="color: #800000">"</span><span style="color: #800000">msg rcv error!n</span><span style="color: #800000">"</span><span style="color: #000000">);
exit(</span><span style="color: #800080">254</span><span style="color: #000000">);
}
printf(</span><span style="color: #800000">"</span><span style="color: #800000">The received message: %s.n</span><span style="color: #800000">"</span><span style="color: #000000">,rcvmsg.msgtext);
</span><span style="color: #008000">//</span><span style="color: #008000"> 下面的代码会删除消息队列,这里把它注释掉是为了使用 ipcs 命令进行观察
</span><span style="color: #008000">//</span><span style="color: #008000"> msgctl(msgid,IPC_RMID,0);</span>
exit(<span style="color: #800080">0</span><span style="color: #000000">);
}
$ -Wall msgqueue.c -o msgqueue_demo
$ ./msgqueue_demo

$ ipcs -q

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