【问题标题】:message queue mutilple receiver implementation消息队列多接收器实现
【发布时间】:2014-04-02 06:27:27
【问题描述】:

广播节目是这样的。我使用了 3 个不同的键,但只有第一个侦听器收到消息。另一个收到消息发送错误。键应该识别不同的用户,不是吗??

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

struct msgbuf
{
long mtype;
char mtext[140];
}send_buf,recv_buf;

int send_msg_id,send_msg_id1,send_msg_id2;
key_t send_key,send_key1,send_key2;

int main()
{
send_key=ftok("broadcast.c",'A');
send_key1=ftok("broadcast.c",'B');
send_key2=ftok("broadcast.c",'C');
char save[140];
if (send_key==-1)
{
    perror("\nCaller send key error(ftok)");
    exit(1);
}
send_msg_id=msgget(send_key,0666 | IPC_CREAT);
send_msg_id1=msgget(send_key,0555 | IPC_CREAT);
send_msg_id2=msgget(send_key,0777 | IPC_CREAT);
if (send_msg_id==-1)
{   
    printf("\nCaller send msgget error");
    exit(1);
}
printf("\nCALLER:");
while (fgets(send_buf.mtext,sizeof(send_buf.mtext),stdin)!=NULL)
{
    send_buf.mtype=1;
    int len=strlen(send_buf.mtext);
    strcpy(save,send_buf.mtext);
    if (send_buf.mtext[len-1]=='\n');
        send_buf.mtext[len-1]='\0';
    if (msgsnd(send_msg_id,&send_buf,len+1,0)==-1)
        printf("\nMsg sending error\n");
    strcpy(send_buf.mtext,save);
    if (msgsnd(send_msg_id1,&send_buf,len+1,0)==-1)
        perror("\nMsg sending error (send_msg_id1)");
    strcpy(send_buf.mtext,save);
    if (msgsnd(send_msg_id2,&send_buf,len+1,0)==-1)
        perror("\nMsg sending error (send_msg_id2)");
}
int i=0;
while(i<9999)
    i++;
msgctl(send_msg_id,IPC_RMID,NULL);
return 0;
}

【问题讨论】:

    标签: c message-queue


    【解决方案1】:

    我在查看您的代码时发现了一些可能的问题。

    首先,您拨打msgget() 三次。每次您使用存储在变量send_key 中的相同密钥时。我相信这段代码应该是:

    send_msg_id= msgget(send_key,  0666 | IPC_CREAT);
    send_msg_id1=msgget(send_key1, 0555 | IPC_CREAT);
    send_msg_id2=msgget(send_key2, 0777 | IPC_CREAT);
    

    注意第二行中send_keysend_key1 和第三行中send_keysend_key3 的变化。

    其次,值066605550777代表消息队列的权限。如 msgget() 手册页所述:

    创建时,参数 msgflg 的最低有效位定义消息队列的权限。这些权限位与为 open(2) 的 mode 参数指定的权限具有相同的格式和语义。 (不使用执行权限。)

    因此,0666 向所有人授予读/写权限,0555 向所有人授予读权限,0777 向所有人授予读/写权限(如手册页中所述,忽略执行位)。这可能不是你的意图。最简单的更改是将这些都设为0666 用于读/写(如果您想限制仅对您的用户的访问,则为 0600)。 0555 将是一个问题,因为它是只读的。所以,上面进一步改为:

    send_msg_id= msgget(send_key,  0666 | IPC_CREAT);
    send_msg_id1=msgget(send_key1, 0666 | IPC_CREAT);
    send_msg_id2=msgget(send_key2, 0666 | IPC_CREAT);
    

    第三,您只检查第一个 ftokmsgget 调用的返回码。您可能应该检查所有三个的返回码,以确保那里没有问题。

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 2013-02-07
      • 2012-01-19
      • 1970-01-01
      • 2010-09-19
      • 2012-11-16
      • 2013-12-06
      • 2011-07-10
      • 2011-07-15
      相关资源
      最近更新 更多