【问题标题】:Use of ftok() to create key and how to use the key?使用 ftok() 创建密钥以及如何使用密钥?
【发布时间】:2018-10-10 07:16:33
【问题描述】:

我正在对消息队列进行一些编码。
ftoK() 有什么用?
什么是创建密钥?
钥匙有什么用?
在我的代码中,我使用它作为键“(key_t)1234”,代码运行良好。 这个键“(key_t)1234”是什么意思? 如何创建自己的密钥?

发件人:

struct mesg_q
{
    char msg_txt[100];
    long msg_typ;
};

int main()
{
    int msgid;
    //key_t msg_key;
    char buffer[100]; 

    struct mesg_q msgq;
    msgid=msgget((key_t)1234, 0666 | IPC_CREAT);

    if(msgid== -1)
    {    
        printf("msgget failed\n");
        return -1;
    }

    while(1)
    { 
        printf("Text Message\n");
        fgets(msgq.msg_txt,100,stdin);

        if(msgsnd(msgid,&msgq,100,0)==-1)
        {
            printf("Send failed\n");
            return -1;
        }  
        else
        {
            printf("Message send\n");
        }    
    }   
}    

接收者:

struct mesg_q
{
    char msg_txt[100];
    long msg_typ;
};

int main()
{
    int msgid;
    char buffer[100];
    long int rec_buff=0;
    key_t key;
    struct mesg_q msgq;
    msgid=msgget((key_t)1234, 0666 | IPC_CREAT);

    if(msgid == -1)
    {
        printf("Msgget failed\n");
        return -1;
    }

    while(1)
    {
        if(msgrcv(msgid,&msgq,100,rec_buff,0)==-1)
        {
            printf("Mesg recv failed\n");
            return -1;
        }
        else
        {
            printf("Mesg Recvd\n");
        }
        printf("Recvd mesg=%s\n",msgq.msg_txt);
    }     
}

【问题讨论】:

  • 在我注意到你并不是一个新手之前,我已经为你做了很多格式化。请尽早学习如何为你自己做这些。
  • 请参考 ftok() 的规范(大概您参考例如man7.org/linux/man-pages/man3/ftok.3.html),以更清楚地解释您所询问的内容的详细信息。乍一看,该规范似乎可以解释您的问题。因此,您需要更具体地说明您不清楚的地方。如果您要求提供有关此功能的基本使用以及您需要它的情况的教程,请记住,对教程的请求在 StackOverflow 上是题外话。

标签: c data-structures message-queue embedded-linux


【解决方案1】:

首先,我正在对消息队列进行一些编码。 ftoK() 有什么用 和创建密钥?密钥有什么用?阅读手册页ftok它说

key_t ftok(const char *pathname, int proj_id);

ftok() 函数使用由给定文件命名的文件的标识 路径名(必须引用 一个现有的,可访问的文件),今天 proj_id 是一个 int,但仍然只使用 8 位。典型用法有一个 ASCII 字符 proj_id,这就是为什么当 proj_id 为零时,行为被称为未定义的原因。

ftok 要求存在file,因为它使用该文件的inode information 来创建key

其次,这个键“(key_t)1234”是什么意思?检查msgget()第一个参数,它是key_t类型和1234不是key_t类型,它是一个整数,因此您将其类型转换为 key_t 类型。

在您的代码中,您没有使用ftok() 创建key,您可以像这样创建它。

key_t key;
key = ftok("file.c", 'b'));/*instead of taking random 1234, you are generating key from file based on proj_id */
msgid=msgget(key_t, 0666 | IPC_CREAT);

key 有什么用? key 是除了message queue id 之外的内核中识别消息队列的标识符之一。在命令行上运行ipcs -q 并检查。

看到这个Whats is purpose ftok in Message queues

【讨论】:

  • 钥匙能做什么?是为了执行任何操作吗?
  • 与之关联的每个消息队列都是keyid。用于识别消息队列的内核参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2016-12-28
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多