我在一个 .c 文件中打开了一个消息队列,成功后它会显示消息队列 ID 为 3。当该程序仍在运行时,在另一个终端中启动另一个程序(另一个 .c 文件),它会创建一个具有不同 mqd_t 的新消息队列。但它的 ID 也显示为 3。这是个问题吗?
服务器文件如下:
void server(char* req_mq) {
struct mq_attr attr;
mqd_t mqdes;
struct request* msgptr;
int n;
char *bufptr;
int buflen;
pid_t apid;
//attr.mq_maxmsg = 300;
//attr.mq_msgsize = 1024;
mqdes = mq_open(req_mq, O_RDWR | O_CREAT, 0666, NULL);
if (mqdes == -1) {
perror("can not create msg queue\n");
exit(1);
}
printf("server mq created, mq id = %d\n", (int) mqdes);
客户端的表现如下:
void client(char* req_mq, int min, int max, char* dir_path_name, char* outfile) {
pid_t pid;
/* get the process id */
if ((pid = getpid()) < 0) {
perror("unable to get client pid");
}
mqd_t mqd, dq;
char pfx[50] = DQ_PRFX;
char suffix[50]; //
sprintf(suffix, "%d", pid);
strcat(pfx, suffix);
dq = mq_open(pfx, O_RDWR | O_CREAT, 0666, NULL);
if (dq == -1) {
perror("can not open data queue\n");
exit(1);
}
printf("data queue created, mq id = %d\n", (int) dq);
mqd = mq_open(req_mq, O_RDWR);
if (mqd == -1) {
perror("can not open msg queue\n");
exit(1);
}
和似乎共享相同的ID 3。
mqd_t
是一个整数类型的东西,正如 POSIX、Linux 和 FreeBSD 的mq_open(3)
手册所建议的那样。也就是说,它们都表示该函数在出错时应返回(mqd_t)-1
。实际上,在 Linux 中它是一个文件描述符,即一个int
。 - FooFmqd_t
,我完全同意。我只是想表达技术上的观察,即它并不那么难懂。我不认为你可以将“-1”转换为联合(或结构)类型!?!如果mqd_t
是不透明的,那么就需要一个特殊的常量来表示错误。我的评论只涉及“opaque”这个词的语义。该类型类似于pid_t
(fork(2)
可能会返回(pid_t)-1
表示错误)。它不像pthread_t
,后者是不透明类型,在符合POSIX标准的方式下不能具有值“-1”。 - FooF