gpt4 book ai didi

c - 不同的Linux消息队列有相同的id?

转载 作者:IT王子 更新时间:2023-10-29 00:32:35 26 4
gpt4 key购买 nike

我在 .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);
}

mqdes 和 dq 似乎共享同一个 id 3。

最佳答案

将句柄视为数组索引。操作系统保存的数组的索引,系统中的每个进程一个。

当您打开一个句柄(无论是文件、消息队列、套接字等)时,操作系统会将该对象的设置记录在一个数组中,该数组对于您的进程是唯一的。然后操作系统将该数组的索引返回给您的程序。

每次您的程序使用该“句柄”时,操作系统实际上只是在该私有(private)数组中查找一个结构,它会不断找出如何处理与该“句柄”相关的对象。

Linux 通常分别为 STDIN、STDOUT 和 STDERR 保留句柄 0、1 和 2。但从那时起,您打开的任何句柄都将编号为 3、4,依此类推。您的句柄 3 可能与文件“/tmp/foo.txt”相关,而另一个进程的句柄 3 可能与文件“/tmp/bar.txt”相关。因此,如果两个进程使用相似的文件“句柄”,则它是无关紧要的。

顺便说一句,您不需要知道或关心句柄实际包含的内容。理论上它可以是任何东西——一个魔数(Magic Number)、一个指针、一个整数,都没有关系。句柄实际上是一个 secret token ,您可以在需要访问系统对象时随时将其交给操作系统。

关于c - 不同的Linux消息队列有相同的id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2396647/

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