曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6428|回复: 0
打印 上一主题 下一主题

[进程] msgsnd | 消息发送

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-9-3 13:05:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能:向消息队列发送数据

原型
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

msgsnd 各参数含义如下:
      msqid : 函数向 msqid 标识的消息队列发送一个消息。
      msgp : msgp 指向要发送的消息。
      msgsz : 要发送的消息大小,不包含消息类型占用的 4 个字节。
      msgflg : 操作标志位。可以设置为 0 或者 IPC_NOWAIT 。如果 msgflg 为 0 ,则当消息队列已满时,msgsnd() 将会阻塞,直到消息可以写进消息队列;如果 msg 为 IPC_NOWAIT ,当消息队列已满时,msgsnd() 函数将不等待立即返回。
msgsnd() 函数成功返回 0 ,失败返回 -1 。常见的错误码有: EAGAIN --- 说明消息队列已满; EIDRM --- 说明消息队列已被删除; EACCESS -- 说明无权访问消息队列。

测试代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>

#define BUF_SIZE    256
#define PROJ_ID        32
#define PATH_NAME    "."

int main()
{
    /*用户自定义消息缓冲*/
    struct mymsgbuff {
        long msgtype;
        char ctrlstring [BUF_SIZE];
    } msgbuffer;

    int     qid;
    int     msglen;
    key_t    msgkey;

    /*获取键值*/
    if ((msgkey = ftok (PATH_NAME, PROJ_ID)) == -1) {
        perror ("msgget error!\n");
        exit (1);
    }
   
    /*创建消息队列*/
    if ((qid = msgget (msgkey, IPC_CREAT|0660)) == -1) {
        perror ("msgget error!\n");
        exit (1);
    }

    /*填充消息结构,发送消息队列*/
    msgbuffer.msgtype = 3;
    strcpy (msgbuffer.ctrlstring, "Hello message queue");
    msglen = sizeof (struct mymsgbuff) - 4;
   
    if ((msgsnd (qid, &msgbuffer, msglen, 0)) == -1) {
        perror ("msgsnd error!\n");
        exit (1);
    }
   
    return 0;
}
执行程序后,用 ipcs 命令看以下队列消息情况:
------ Message Queues --------
key                     msqid      owner      perms      used-bytes   messages   
0x20086001        0            beyes      660           512                   1  
由上可见,系统内部产生了一个消息队列,其中包含了一条消息,如果再执行一遍,则 messages 一栏的数值就会 + 1 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 01:12 , Processed in 0.068535 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表