gpt4 book ai didi

c - 使用 IPC 队列发送消息时,标识符已删除 (EIDRM) 错误

转载 作者:行者123 更新时间:2023-12-01 12:01:12 25 4
gpt4 key购买 nike

我正在使用 IPC 队列进行进程同步。

从 IPC 队列发送接收消息时,我总是收到 EIDRM 错误,但我可以看到队列与 ipcs 一起存在。

我已经搜索了 2 个小时,但我看不到错误。

下面的代码是一个精简的版本,它给了我同样的错误。

#define CLAVE 53543961
#define TAM_BUFFER 1024
#define PERMISOS 0777
#define DEBUG

int Cola_Mensages;
int msgqid;


typedef struct {
long mtype;
char mtext[TAM_BUFFER];
}msgbuf;


int main (int argc, char *argv[]){
msgbuf msg_ipc;
int num_cli,i, i_aux;

if(argc == 2){
num_cli = atoi(argv[1]);
}else{
num_cli = 1;
}


//Creating the queue
if(msgqid = msgget(CLAVE,PERMISOS|IPC_CREAT)<0){
fprintf(stderr,"Problema al crear la cola de mensages IPC\n");
exit(0);
}

if(msgqid < 0){
fprintf(stderr,"Problema al crear la cola de mensages IPC\n");
exit(0);
}


for(i = 0;i<num_cli;i++){
//here i get the error
i_aux=msgrcv(msgqid,&msg_ipc,TAM_BUFFER,1,0);
if(i_aux == -1)
fprintf(stderr,"Error enviando msg ipc %s \n",strerror(errno));
}

msg_ipc.mtype = 2;
strcpy(msg_ipc.mtext,"COMIENZO");
printf("Enviando msg\n");

for(i = 0;i<num_cli;i++){
printf("Enviado msg %d\n",i);
//here i also get the same error
if (msgsnd(msgqid,(char *) &msg_ipc,strlen(msg_ipc.mtext),0)!=0)
{
fprintf(stderr,"Ocurrio el error %s en msgsnd\n",strerror(errno));
exit(4);
}
}


if (msgctl(msgqid,IPC_RMID,(struct msqid_ds *) NULL)<0)
{
fprintf(stderr,"Error al borrar la cola de mensajes de clave %d\n",CLAVE);
exit(4);
}

return 0;

}

最佳答案

问题在于precedence and order of evaluation in C处理不当, 每当您针对低于 0 的值评估 msgget 返回值时:

if(msgqid = msgget(CLAVE,PERMISOS|IPC_CREAT)<0){
fprintf(stderr,"Problema al crear la cola de mensages IPC\n");
exit(0);
}

赋值运算符 = 的优先级低于比较一 <,这意味着您正在分配 msgget() < 0 的结果到 msgqid 并且不检查是否 (msgqid = msgget()) < 0 .

然后,您应该用括号将作业括起来:
if((msgqid = msgget(CLAVE, PERMISOS | IPC_CREAT)) < 0){
fprintf(stderr,"Problema al crear la cola de mensages IPC\n");
exit(0);
}

关于c - 使用 IPC 队列发送消息时,标识符已删除 (EIDRM) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1285104/

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