我在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;
输出:
信息队列ID:45416448
在读取以下内容之前:local:45416448 global:45416448
在读取本地:45416448全局:0之后
...
您可以看到,运行msgrcv()
后,即使我使用变量将值传递给方法msgQ
,read_msgs()
的值也变为0。 / p>
答案 0 :(得分:1)
msgrcv
函数使用一个指向结构的指针,该结构以long
类型的“标头”开头,后跟消息数据。 msgrcv
的第三个参数msgsz
是消息数据主体的大小,不包括作为标题的long
。因此,您应该传递类似sizeof message - sizeof(long)
之类的东西。通过传递sizeof message
,您要求它使缓冲区sizeof(long)
字节溢出,这正在破坏其他一些全局变量。
答案 1 :(得分:0)
我找到了解决方案,我不确定为什么会这样,但是解决了。
我只是从头开始初始化int。
已更改:
int msgQ; // global int
针对:
int msgQ = 0; // global int