无法使用C中的POSIX将整数从一个进程发送到另一个进程

时间:2014-04-26 06:22:16

标签: c process operating-system posix msgrcv

我在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;当中央进程继续在后台运行时,外部进程终止。

2 个答案:

答案 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