Использование ftok () для создания ключа и как использовать ключ? - PullRequest
0 голосов
/ 30 апреля 2018

Я делаю кодирование в очередях сообщений. Какая польза от ftoK ()?
Что такое создание ключей?
Какая польза от ключа?
В моем коде я использую это как ключ "(key_t) 1234", код работает нормально. В чем смысл этого ключа "(key_t) 1234"? Как я могу создать свой собственный ключ?

Sender:

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);
    }     
}

1 Ответ

0 голосов
/ 30 апреля 2018

Во-первых, Я делаю кодирование в очередях сообщений. какая польза от ftoK () а создание ключей? для чего нужен ключ? Прочтите страницу руководства ftok там написано

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

Функция ftok () использует идентификатор файла с именем данного путь (который должен ссылаться на существующий доступный файл), а сегодня proj_id является целым числом, но используется только 8 бит. Типичное использование имеет символ ASCII proj_id, поэтому поведение называется неопределенным, когда proj_id равен нулю.

ftok требует, чтобы существовал file, поскольку он использует inode information этого файла для создания key.

Во-вторых, что означает этот ключ "(key_t) 1234"? проверить первый аргумент msgget(), он типа key_t и 1234 не типа key_t, это целое число, поэтому вы вводите его типом key_t.

В вашем коде вы не создали key с помощью ftok(), вы можете создать его как.

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 является одним из идентификаторов для идентификации очереди сообщений в ядре, кроме message queue id. Запустите ipcs -q в командной строке и проверьте.

Смотрите это Какова цель ftok в очередях сообщений

...