3

我在 Linux 上使用 C 语言和 GCC 编译器。我有两个进程,我想将整数从一个进程传递到另一个进程,即从外部进程到中央进程,然后中央进程应该打印它。但是我的代码不起作用。谁能告诉我如何纠正它?这是我的代码

中央.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");
}

外部.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

我收到了这个“外部进程退出”并且外部进程终止,而中央进程继续在后台运行。

4

2 回答 2

1

您传递给的结构msgsnd()不符合要求的格式:

struct msgbuf {
    long mtype;
    ...
};

因此,该temp字段可能被解释为消息类型,从而导致意外结果。

我的建议?避免使用 POSIX 消息队列。如果您需要进程间消息传递,只需使用套接字。它们使用起来要简单得多,并且是网络透明的。

于 2014-04-26T07:16:02.707 回答
1

来自 POSIX 文档msgsnd

应用程序应确保参数 msgp 指向用户定义的缓冲区,该缓冲区首先包含指定消息类型的 long 类型字段,然后是保存消息数据字节的数据部分。下面的结构是这个用户定义的缓冲区的示例:

struct mymsg {
    long   mtype;       /* Message type. */
    char   mtext[1];    /* Message text. */
}

您没有遵循这一点,因此您的代码无法正常工作。long在结构的开头添加一个字段,并将其设置为,2因为这是您的接收者期望的消息类型。

还将该结构定义移动到头文件中,以便您可以在两段代码之间共享它,而不是复制它。

 if(msgqid=msgget(MsgKey, 0600 | IPC_CREAT)<0)

在分配周围添加括号(在两段代码中):

 if((msgqid=msgget(MsgKey, 0600 | IPC_CREAT)) < 0)

<并且其他比较运算符的优先级高于赋值运算符,因此如果没有括号,您的代码是不正确的 - 它将比较结果分配给msgqid.

最后,main 返回一个int, never void

于 2014-04-26T07:16:13.997 回答