首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么msgrcv()将msqid设置为0?

为什么msgrcv()将msqid设置为0?
EN

Stack Overflow用户
提问于 2018-11-10 02:51:54
回答 2查看 341关注 0票数 1

我在c中有一个程序,它应该通过msgq发送和接收ipc消息。

我遇到的问题是,当我运行msgrcv()时,它将我的全局int msqid设置为0。当然,我在其他方法中也需要它,比如信号处理器。

以下是一些代码:

代码语言:javascript
复制
/* 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文件:

代码语言:javascript
复制
#include <sys/msg.h>

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

产出:

msg队列id: 45416448 阅读前本地:45416448全球:45416448 读取后的本地:45416448全局:0 ..。

您可以看到,在运行msgrcv()之后,msgQ的值将变为0,尽管我使用一个变量将该值传递给方法read_msgs()

EN

回答 2

Stack Overflow用户

发布于 2018-11-10 03:08:55

msgrcv函数接受一个指向以long类型的“报头”开头的结构的指针,然后是消息数据。msgrcv的第三个参数,msgsz,是消息数据体的大小,不包括消息头( header )的。所以你应该传递一些类似sizeof message - sizeof(long)的东西。通过传递sizeof message,您将请求它溢出缓冲区sizeof(long)字节,这将破坏其他一些全局变量。

票数 1
EN

Stack Overflow用户

发布于 2018-11-11 12:32:58

我找到了解决办法,我不知道为什么,但它解决了它。

我从一开始就初始化了int。

更改:

代码语言:javascript
复制
int msgQ; // global int

适用于:

代码语言:javascript
复制
int msgQ = 0; // global int
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53235628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档