关于消息队列的几点疑惑,望解答

发布于 2022-10-15 06:24:05 字数 5954 浏览 17 评论 0

代码1:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>

int main()
{
        key_t  Key1,Key2,Key3;   //定义了3个键值变量
        if((Key1=ftok("/etc/profile",1))==-1)   //调用ftok生成键值
        {
                perror("ftok");
                exit (1);
        }

        if((Key2=ftok("/etc/profile",2))==-1)   //调用ftok生成键值
        {
                perror("ftok");
                exit (2);
        }

        if((Key3=ftok("/etc/profile",1))==-1)   //调用ftok生成键值
        {
                perror("ftok");
                exit (3);
        }
        printf("Key1=%ld Key2=%ld Key3=%ld.\n",Key1,Key2,Key3);
        exit (0);
}

代码2::#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main()
{
        key_t  key;
        int nMsgld;    //消息队列标识符
        if(key=ftok("/etc/profile",1)==-1)   //生成键值
        {
                perror("ftok");
                exit (1);
        }
        printf("key=%ld.\n",key);
        if((nMsgld=msgget(key,IPC_CREAT|IPC_EXCL|0666))==-1)   //创建消息队列
        {
                if(errno!=EEXIST)   //创建失败并且不是由于队列已存在
                {
                        perror("msgget");
                        exit (2);
                }
        if((nMsgld=msgget(key,0))==-1)   //消息队列已存在,返回队列描述符
        {
                perror("msgget");
                exit (3);
        }
        }
        printf("MsgID=%d\n",nMsgld);   //输出消息队列描述符
        exit (0);
}

疑惑1::同样对于if(key=ftok("/etc/profile",1)==-1)   //生成键值    这条语句,为什么生成的键值不同??后面那个代码2 的键值怎么会是 0 呢??
疑惑2::当我运行第二个函数几下后,出现如下结果:;
long@long-laptop:/home/IPC/XXDL$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages   
0x00000000 0          long       666        0            0           
0x00000000 32769      long       666        0            0           
0x00000000 65538      long       666        0            0           
0x00000000 98307      long       666        0            0           
0x00000000 131076     long       666        0            0           
0x00000000 163845     long       666        0            0           
0x00000000 196614     long       666        0            0           
0x00000000 229383     long       666        0            0           
0x00000000 262152     long       666        0            0           

为什么我创建了一个消息之后,再运行程序貌似又创建了一个新消息了,程序的代码不是消息存在的话,只是输出消息的描述符马??我的理解应该再运行程序返回的描述符会相同,为什么出现上面的结果呢??

刚学习,请解释一下。。。。多谢了//////

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倦话 2022-10-22 06:24:05

不好意思,我掉了一个符号。。。。。。。哎。。。。。。。。。解决了。。。。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文