jackarm 发表于 2010-5-21 16:07:52

消息队列 linux

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/msg.h>

#define MSG_TEST "/tmp/8"

struct msg_buf
{
intmytype;
char data;
};

int main(int argc,char **argv)
{
key_t key;
int pid;
int msgid,status;
struct msg_buf msgbuf;
       
        key = ftok(MSG_TEST,'a');
        printf("key = %X\n",key);
       
        msgid = msgget(key,IPC_CREAT|0666);
        if(msgid == -1)
        {
                printf("msg creat err\n");
                return -1;
        }
        memset(&msgbuf,'\0',sizeof(msgbuf));
        msgbuf.mytype = getpid();
        strcpy(msgbuf.data,"hubei huang gang zhi ye ji shu xue yuan---->\n");
        strcat(msgbuf.data,argv);
        status = msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
        if(status == -1)
        {
                printf("send msg err\n");
                return -1;
        }
        memset(&msgbuf,'\0',sizeof(msgbuf));
        status = msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);       
        if(status == -1)
        {
                printf("rcv msg err\n");
                return -1;
        }
        printf("This is msg:%s\n",msgbuf.data);
        return 0;

}

jackarm 发表于 2010-5-21 16:11:06

http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_555740.jpg
运行结果 (原文件名:111111111111.jpg)

minux 发表于 2010-5-21 17:48:57

不是打击你,这程序问题很多啊……

(1) 不是64-bit clean. (这里问题多了去了,比如struct msg_buf的定义就不对;假设了ftok(3)总是返回int类型的keyid)
(2) getpid()引用前未声明,需要添加#include <unistd.h>
(3) 没有判断argc的数值
(4) 出错的时候为啥不用perror(3)来报告出错信息,给用户/自己更多的提示……
(5) 没有任何边界检查,存在buffer overrun的问题

jackarm 发表于 2010-6-24 09:29:48

首先谢谢楼上的批评。

我这是MINI2440板子带的DEMO。

还有就是 这只是测试用,就比如 argc这个判断。测试你自己给自己找麻烦!呵呵`做人好执着哦!
页: [1]
查看完整版本: 消息队列 linux