gpt4 book ai didi

c - 消息队列多接收者实现

转载 作者:行者123 更新时间:2023-11-30 15:35:49 24 4
gpt4 key购买 nike

广播程序是这样的。我使用了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;
}

最佳答案

我在检查您的代码时注意到一些可能的问题。

首先,调用 msgget() 三次。每次您使用存储在变量 send_key 中的相同 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_key 更改为 send_key1,第三行中的 send_key 更改为 send_key3 .

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

Upon creation, the least significant bits of the argument msgflg define the permissions of the message queue. These permission bits have the same format and semantics as the permissions specified for the mode argument of open(2). (The execute permissions are not used.)

因此,0666 向所有人授予读/写权限,0555 向所有人授予读权限,0777 向所有人授予读/写权限all(如手册页所述,执行位被忽略)。这可能不是你的本意。最简单的更改是将这些全部设置为读/写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 调用的返回代码。您可能应该检查所有三个的返回代码以确保那里没有问题。

关于c - 消息队列多接收者实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com