gpt4 book ai didi

c - mq_open 为四个队列返回 0

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:09 25 4
gpt4 key购买 nike

我正在用 POSIX 消息队列制作简单的程序。我打开了四个队列,但所有返回的描述符都是零(不是 -1,这表示打开过程中出现错误)。而且当我尝试接收或发送时,我收到错误:错误的文件描述符。哪里会出现错误?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <mqueue.h>
#define _GNU_SOURCE
#define ERR(source) (fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\
perror(source),kill(0,SIGKILL),\
exit(EXIT_FAILURE))


#define MSGSIZE 100

void usage(void){
fprintf(stderr,"USAGE: niepoprawna ilosc argumentow\n");
fprintf(stderr,"argumenty muszą być wieksze niz 0 \n");
exit(EXIT_FAILURE);
}

int main(int argc, char *argv[])
{
if (argc!=5)
usage();

int dz1 = atoi(argv[1]);
int dz2 = atoi(argv[2]);
int dz3 = atoi(argv[3]);
int dz4 = atoi(argv[4]);

char* name1 = malloc(50);
if (!name1) ERR("MALLOC");

char* name2 = malloc(50);
if (!name2) ERR("MALLOC");

char* name3 = malloc(50);
if (!name3) ERR("MALLOC");

char* name4 = malloc(50);
if (!name4) ERR("MALLOC");

int pid = getpid();

if (snprintf(name1, 50, "/%d_%d", pid, dz1)<0)
ERR("snprintf");

if (snprintf(name2, 50, "/%d_%d", pid, dz2)<0)
ERR("snprintf");

if (snprintf(name3, 50, "/%d_%d", pid, dz3)<0)
ERR("snprintf");

if (snprintf(name4, 50, "/%d_%d", pid, dz4)<0)
ERR("snprintf");


mqd_t des1, des2, des3, des4;

struct mq_attr attr;
attr.mq_maxmsg=10;
attr.mq_msgsize=MSGSIZE -2;


if (des1 = TEMP_FAILURE_RETRY(mq_open(name1, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");


printf("dekryptor: %d ", des1);

if (des2 = TEMP_FAILURE_RETRY(mq_open(name2, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");


printf("dekryptor: %d ", des2);

if (des3 = TEMP_FAILURE_RETRY(mq_open(name3, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");


printf("dekryptor: %d ", des3);

if (des4 = TEMP_FAILURE_RETRY(mq_open(name4, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr)) < 0)
ERR("MQOPEN");

printf("dekryptor: %d ", des4);

puts(name1);
puts(name2);
puts(name3);
puts(name4);


struct timespec timeout;
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec=0;
timeout.tv_nsec= 200000000;

char* bufor = malloc(MSGSIZE);
if (!bufor) ERR("malloc");


printf("dekryptor: %d ", des1);

if (mq_timedreceive(des1, bufor, MSGSIZE, NULL, &timeout) < 0)
ERR("mq_timedreceive");

if (mq_send(des1, bufor, MSGSIZE, NULL) < 0)
ERR("mw_send");

mq_close(des1);
mq_close(des2);
mq_close(des3);
mq_close(des4);

if(mq_unlink(name1))ERR("mq unlink");
if(mq_unlink(name2))ERR("mq unlink");
if(mq_unlink(name3))ERR("mq unlink");
if(mq_unlink(name4))ERR("mq unlink");

}

最佳答案

您没有设置 des# mq_open 返回的值,您将其设置为 < 返回的值运算符,因为 <优先级高于 = .自 mq_open成功了,< 0返回 false ,即 0 ,然后设置为所有 des#变量。

您需要另一组括号。

if ((des1 = TEMP_FAILURE_RETRY(mq_open(name1, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr))) < 0)

或分两步完成。

des1 = TEMP_FAILURE_RETRY(mq_open(name1, O_RDWR | O_CREAT | O_NONBLOCK, 0666, &attr));
if (des1 < 0)

关于c - mq_open 为四个队列返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37491361/

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