我在Linux上使用C语言和GCC编译器。 我有两个进程,我想将整数从一个进程传递到另一个进程,即从外部进程到中央进程,而中央进程应该打印它。但我的代码不起作用。谁能告诉我如何纠正它? 这是我的代码
central.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#define MsgKey 2345
typedef struct data_struct
{
int temp;
}data;
void main(void)
{
data temp_msg;
int msgqid;
if(msgqid=msgget(MsgKey, 0600 | IPC_CREAT)<0)
{
printf("From Central Process: Msg queue failed");
}
msgrcv(msgqid,&temp_msg,sizeof(temp_msg),2,0);
printf("Value = %d\n",temp_msg.temp);
printf("Central process exiting\n");
}
external.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#define MsgKey 2345
typedef struct data_struct
{
int temp;
}data;
void main(void)
{
data temp_msg;
int msgqid;
temp_msg.temp=5;
if(msgqid=msgget(MsgKey, 0600 | IPC_CREAT)<0)
{
printf("From External Process: Msg queue failed");
}
if(msgsnd(msgqid,&temp_msg,sizeof(temp_msg),0)<0)
{
printf("Error");
}
printf("External process exiting\n");
}
比我输入的终端
gcc -o central central.c
gcc -o external external.c
./central &
./external
我收到了这个&#34;外部流程退出&#34;当中央进程继续在后台运行时,外部进程终止。
答案 0 :(得分:1)
您传递给msgsnd()
的结构不符合所需格式:
struct msgbuf {
long mtype;
...
};
因此,temp
字段可能被解释为消息类型,从而导致意外结果。
我的建议?避免使用POSIX消息队列。如果需要进程间消息传递,只需使用套接字即可。它们使用起来更简单,并且网络透明。
答案 1 :(得分:1)
来自msgsnd
的POSIX文档:
应用程序应确保参数msgp指向用户定义的缓冲区,该缓冲区首先包含指定消息类型的long类型字段,然后是包含数据字节的数据部分的消息。下面的结构是这个用户定义的缓冲区的示例:
struct mymsg { long mtype; /* Message type. */ char mtext[1]; /* Message text. */ }
您没有遵循这一点,因此您的代码无法正常运行。在结构的开头添加long
字段,并将其设置为2
,因为这是您的接收者期望的消息类型。
同时将该结构定义移动到头文件中,以便您可以在两段代码之间共享它而不是复制它。
if(msgqid=msgget(MsgKey, 0600 | IPC_CREAT)<0)
在作业周围添加parens(在两段代码中):
if((msgqid=msgget(MsgKey, 0600 | IPC_CREAT)) < 0)
<
和其他比较运算符的优先级高于赋值运算符,因此没有parens的代码是错误的 - 它会将比较结果赋给msgqid
。
最后, main返回int
,而不是void
。