FIFO两个不同进程c ++之间的通信

时间:2013-07-02 09:55:00

标签: c++ process fifo

嗨,请有人帮助我

我有两个过程说一些X和Y. X和Y都有以下信息

typedef enum {
    HEALTHY=1,
    FAULTY=2,
    CHANGE=3,
    ERROR=4
} MsgTypeT;

typedef struct {
    char role[16];
    char state[16];
    char info[256];
} InfoT;

typedef struct {
    MsgTypeT type;
    int size;
    InfoT *data;
} MsgT;

这里的条件是如果进程Y发送信息进程,X将读取它 所以我在x和y之间使用了fifo Y有一个函数写缓冲区,写入fifo,代码如下

int write_buffer(HA_DEVMON_MsgT const* send)
{                   
char* dest = buffer;
memcpy( dest, &send->type, sizeof( MsgTypeT ));
dest += sizeof(MsgTypeT);
memcpy( dest, &send->size, sizeof( int ));
dest += sizeof(int);
memcpy( dest, send->data, sizeof( InfoT ));
dest += sizeof(InfoT);
int byteCount = write( this->fifo_fd, buffer, dest - buffer );
if ( byteCount != dest - buffer ) {
cout<<"Error in writing ";
}
return byteCount == dest - buffer ? 0 : -1;
}

我认为它写的很完美,因为cout语句工作正常,当试图输出nbytes时它给了512bytes写了

现在,当X试图读取它时,为角色和状态提供空值也会给出6441568的大小 它只给MsgTypeT更正其他值为null :( 代码如下---我做错了,请更正

int readMsg(MsgT *msg)
{
    int rCode=0, nbytes=0;
    char buffer[512]={0};

    nbytes = read(this->get_handle(), buffer, sizeof(buffer));
    if (nbytes < 0) {
        cout<<"error in read";
        rCode=-1;
    } 
    if (rCode == 0) {
        char *p_src = (char *)buffer;
        mempcpy(&msg->type, p_src, sizeof(MsgTypeT));
        p_src+=sizeof(MsgTypeT);
        mempcpy(&msg->size, p_src, sizeof(int));
        p_src+=sizeof(int);
        msg->data = new InfoT(); //allocating memory (needed or not???)
        mempcpy(msg->data, p_src, sizeof(InfoT));
        p_src+=sizeof(InfoT);
    }
    return rCode;
}

1 个答案:

答案 0 :(得分:2)

readMsg中,您的上一次mempcpy写入msg,而不是InfotT 您刚刚分配的sizeof(InfoT)

另外,但我想你知道这一点:这只能保证 如果两个进程都使用相同的编译器编译,则工作 使用相同的选项。 (在实践中,它可能会起作用 底层系统根据C定义其API,即 适用于Windows和Unix的情况。)

编辑:

此外:写作时遇到同样的问题。你写 MsgT(288)个字节,但你写指针(然后 很多垃圾),而不是它指向的数据。

然后将指针递增到int write_buffer( MsgT const* data ) { char buffer[512] = {}; // Or better yet, std::vector<char> char* dest = buffer; memcpy( dest, &data->type, sizeof( MsgTypeT ) ); dest += sizeof( MsgTypeT ); memcpy( dest, &data->size, sizeof( int ) ); dest += sizeof( int ); memcpy( dest, &data->data, sizeof( InfoT ) ); dest += sizeof( InfoT ); int byteCount = write( fifo_fd, buffer, dest - buffer ); if ( byteCount != dest - buffer ) { std::cerr << "Error in write" << std::endl; } return byteCount == dest - buffer ? 0 : -1; } 对象。这是 如果有任何填充,可能无法工作。你到底是什么 必须做的是:

{{1}}

与阅读时相反。

再一次,这只会对两个进程起作用 同一台机器,使用相同的编译器编译 选项。一个更好的解决方案可能是定义 一个协议,具有整数,字符串的定义表示, 等,将输出格式化为该表示,并解析它 供您参考。这样,即使其中一个,它仍然可以工作 进程是64位,另外32位。