嗨,请有人帮助我
我有两个过程说一些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;
}
答案 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位。