小狮子& 2019-01-06 19:36 采纳率: 100%
浏览 2044
已采纳

消息队列msgget函数返回值一直都是0,创建的消息队列只在第一次开机正常运行

使用msgget函数创建了一个消息队列,但是函数msgget无论每次运行都是返回0.
而且在删除消息队列后再次创建时,使用ipcs -q 命令查看时,可以看到mqid是32767,但是msgget函数的返回值依然是0,并且此时消息队列无法正常收发信息,在函数msgsnd处报错individual argument。此时重启虚拟机,再次运行不会报错,mqid依然是0

#define MAX_SEND_SIZE 80

struct mymsgbuf{
long mtype;
char mtext[MAX_SEND_SIZE];
};

void send_message(int qid,struct mymsgbuf *qbuf,long type,char *text);
void read_message(int qid,struct mymsgbuf *qbuf,long type);
void remove_queue(int qid);
void change_queue_mode(int qid,char *mode);
void usage();

int main(int argc,char *argv[]){

    key_t key;
    int msgqueue_id;
    struct mymsgbuf qbuf;
    if(argc ==1)
        usage();

    /*Create unique key via call to ftok()*/
    key = ftok(".", 2 );

    if( msgqueue_id = msgget( key,IPC_CREAT | 0660) == -1){
        perror("msgget\n");
        exit(1);
    }

    printf("message queue id = [%d]\nkey = %d",msgqueue_id,key);


    switch(tolower(argv[1][0]))
    {
            case 's':
                    if( argc < 4 ){
                            usage();
                            break;
                    }
                    send_message(msgqueue_id,(struct mymsgbuf*)&qbuf,atol(argv[2]),argv[3]);
                    break;

            case 'r':
                    if( argc < 3 ){
                        usage();
                        break;
                    }

                    read_message(msgqueue_id,&qbuf,atol(argv[2]));
                    break;

            case 'm':
                    if( argc < 3 ){
                        usage();
                        break;
                    }
                    change_queue_mode(msgqueue_id,argv[2]);
                    break;

            case 'd':
                    remove_queue(msgqueue_id);
                    break;

            default:
                    usage();        
    }

    return (0);

}

void send_message(int qid,struct mymsgbuf *qbuf,long type,char *text)
{ //Send a message to the queue

printf("Sending a message ...\n");  
qbuf->mtype = type;
strcpy(qbuf->mtext,text);

if((msgsnd(qid,(struct msgbuf *)qbuf,strlen(qbuf->mtext)+1,0)) == -1){
    perror("msgsnd");
    exit(1);
}

}

void read_message(int qid,struct mymsgbuf qbuf,long type){
//Read a message from the queue
printf("Reading a message ...\n");
qbuf->mtype = type;
msgrcv(qid,(struct msgbuf
)qbuf,MAX_SEND_SIZE,type,0);
printf("Type:%ld\nText:%s\n",qbuf->mtype,qbuf->mtext);

}

void remove_queue(int qid){

msgctl(qid,IPC_RMID,0);

}

void change_queue_mode(int qid,char *mode)
{

struct msqid_ds myqueue_ds;
//Get current info
msgctl(qid,IPC_STAT,&myqueue_ds);
//Convert and load the mode
sscanf(mode,"%ho",&myqueue_ds.msg_perm.mode);
//Update the mode
msgctl(qid,IPC_SET,&myqueue_ds);
}

void usage(void)
{

fprintf(stderr,"msgtool -A utility for tinkering with msgqueues\n");
fprintf(stderr,"Usage:msgtool (s)end<type> <messagetext>\n");
fprintf(stderr,"(r)ecv <type>\n");
fprintf(stderr,"(d)elete\n");
fprintf(stderr,"(m)ode <octal mode>\n");
exit(1);

}



  • 写回答

2条回答 默认 最新

  • 软侠 2019-01-07 12:18
    关注

    仔细阅读了一下你的代码,发现有三处明显的错误:

    第一处,在main函数中,这一句:
    if( msgqueue_id = msgget( key,IPC_CREAT | 0660) == -1) {
    请改为:
    if ( (msgqueue_id = msgget( key,IPC_CREAT | 0660)) == -1) {
    上面这一句应该是问题的根源所在,你把它改正后应该就可以了。

    另两处错误是下面这个函数(可能是你抄错了代码吧):
    void read_message(int qid,struct mymsgbuf qbuf,long type){
    //Read a message from the queue
    printf("Reading a message ...\n");
    qbuf->mtype = type;
    msgrcv(qid,(struct msgbuf)qbuf,MAX_SEND_SIZE,type,0);
    printf("Type:%ld\nText:%s\n",qbuf->mtype,qbuf->mtext);

    }
    应该改为:
    void read_message(int qid,struct mymsgbuf *qbuf,long type){
    //Read a message from the queue
    printf("Reading a message ...\n");
    qbuf->mtype = type;
    msgrcv(qid,(struct msgbuf *)qbuf,MAX_SEND_SIZE,type,0);
    printf("Type:%ld\nText:%s\n",qbuf->mtype,qbuf->mtext);

    }

    其它没发现什么问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形