почему msgrcv () устанавливает msqid в 0? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть программа на c, которая должна отправлять и получать сообщения ipc через msgq.

Проблема, с которой я столкнулся, заключается в том, что когда я запускаю msgrcv(), он устанавливает мой глобальный int msqid на 0. И, конечно, он мне нужен при других методах, например, в обработчике сигналов.

вот код:

/* all the includes and some variables*/
#include "msg.h" // include the one I made
int msgQ; // global int

int main(int argc, char *argv[])
{
    key = ftok("progfile", 65);
    msgQ = msgget(key, 0666 | IPC_CREAT);
    printf("msg queue id: %d \n", msgQ);

    start_tik_tok(); // setting up the timer and the signal handler
    /* irrelevant code */

    void read_msgs(msgQ);
}

void read_msgs(int msgQid)
{
    while (1)
    {
        printf("before the read local:%d goval:%d\n", msgQid, msgQ);
        int ret = msgrcv(msgQid, &message, sizeof(message), 1, 0);
        printf("after the read local:%d global :%d\n", msgQid, msgQ);
        if (ret == -1)
            /* error handling */

        switch (message.action_type)
        {
            /* mesage handling */
        }
}

void signal_handler(int signo)
{
    /*I need the global int here to send some messages */
}

void start_tik_tok()
{
    //timer interval for setitimer function
    struct itimerval timer;
    timer.it_interval.tv_sec = 1; //every 1 seconds
    timer.it_interval.tv_usec = 0;
    timer.it_value.tv_sec = 1; //start in 1 seconds
    timer.it_value.tv_usec = 0;

    //action for the signal
    struct sigaction new_sa;
    memset(&new_sa, 0, sizeof(new_sa));
    new_sa.sa_handler = &signal_handler;

    sigaction(SIGALRM, &new_sa, NULL);
    setitimer(ITIMER_REAL, &timer, NULL);
}

файл msg.h:

#include <sys/msg.h>

struct msg_buff{
    long mesg_type; //reciver
    int sender; //sender
    char action_type;
    char time_tiks; //time in tiks
} message;

выход:

идентификатор очереди сообщений: 45416448

до чтения локальный: 45416448 глобальный: 45416448

после чтения локальный: 45416448 глобальный: 0

...

вы можете видеть, что после запуска msgrcv() значение msgQ превращается в 0, хотя я использую переменную для передачи значения методу read_msgs().

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Я нашел решение, я не уверен, почему это так, но оно решило его.

Я только что инициализировал int с самого начала.

изменено:

int msgQ; // global int

для:

int msgQ = 0; // global int
0 голосов
/ 10 ноября 2018

Функция msgrcv получает указатель на структуру, которая начинается с «заголовка» типа long, за которым следуют данные сообщения. Третий аргумент msgrcv, msgsz - это размер тела данных сообщения, , не включая long, то есть заголовок . Так что вы должны передать что-то вроде sizeof message - sizeof(long). Передав sizeof message, вы просите его переполнить буфер sizeof(long) байтов, и это забивает какую-то другую глобальную переменную.

...