gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:32 26 4
gpt4 key购买 nike

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

我遇到的问题是,当我运行 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;

输出:

msg queue id: 45416448

before the read local:45416448 global:45416448

after the read local:45416448 global:0

...

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

最佳答案

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

关于c - 为什么 msgrcv() 将 msqid 设置为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com