曲径通幽论坛

标题: msgsnd | 消息发送 [打印本页]

作者: beyes    时间: 2009-9-3 13:05
标题: msgsnd | 消息发送
功能:向消息队列发送数据

原型
#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 各参数含义如下:
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 。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2