我想创建一个消息队列,但在id创建时出错。有人为我提供了一个更好的msgget创建id的解决方案。
msgid=msgget((key_t)1234,0666 | IPC_CREAT);
我正在收到msgid == - 1
#include<stdio.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/msg.h>
struct msg_buf{
long msg_type;
char msg_txt[100];
}message;
int main()
{
//key_t key;
int msgid;
//key=ftok("progfile",65);
msgid=msgget((key_t)1234,0666 | IPC_CREAT);
if(msgid==-1)
{
printf("[-]Error in creating id:\n");
exit(1);
}
printf("[+]MSGID created:\n");
message.msg_type=1;
printf("Write data:");
scanf("%s",message.msg_txt);
if(msgsnd(msgid,&message,sizeof(message),0)==-1)
{
printf("[-]Error while semnding message:\n");
exit(1);
}
printf("Data send is: %s \n",message.msg_txt);
return 0;
}
输出:
root@DESKTOP-UFTQBQ8:/mnt/c/Users/BRAHMA JAISWAL/Desktop# ./b
[-]Error in id creation:
答案 0 :(得分:0)
我想创建一个消息队列但在ID创建中出错?在创建消息队列部分时,我没有看到代码中的任何错误。一旦按ipcrm -q id
&amp;删除邮件队列再次运行你的代码。
或者,您可以使用POSIX IPC mq_open
,mq_send
,mq_receive
,因为所有POSIX IPC都是线程安全的。来自mq_open
mq_open()创建新的POSIX消息队列或打开现有队列 队列。队列由标识 名称。有关名称构造的详细信息,请参阅mq_overview(7)。
示例代码
int main(void) {
mqd_t fd;
char buf[30];
printf("\nEnter message you wanna send :\n");
fgets(buf,sizeof(buf),stdin);
fd = mq_open("/my_mq",O_RDWR|O_CREAT,0777,NULL);
if(fd == -1){
perror("mq_open");
exit(0);
}
if(mq_send(fd,buf,sizeof(buf),0) == -1){
perror("mq_send");
exit(0);
}
return 0;
}
阅读此difference between msgget() and mq_open和System V IPC vs POSIX IPC