Привет, пожалуйста, кто-нибудь, помогите мне
У меня есть два процесса, скажем, некоторые 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 прочитает ее
Так что я использовал 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;
}
В readMsg
, Твоя последняя mempcpy
пишет msg
не к
InfotT
Вы только что выделены.
Кроме того, но я полагаю, вы знаете это: это гарантировано только
работать, если оба процесса были скомпилированы одним и тем же компилятором,
используя те же параметры. (На практике это может сработать, если
базовая система определяет свой API в терминах C, который
дело для Windows и Unix.)
РЕДАКТИРОВАТЬ:
Далее: у вас такая же проблема при написании. Ты пишешь
sizeof(InfoT)
(288) байт, но вы пишете указатель (а затем
много мусора), а не данные, на которые он указывает.
И вы увеличиваете указатель в MsgT
объект. Это
скорее всего, не будет работать, если есть какие-либо дополнения. Что ты на самом деле
нужно сделать это:
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;
}
и наоборот при чтении.
И еще раз, это будет действительно работать только для двух процессов на
тот же компьютер, скомпилированный с тем же компилятором, используя тот же
опции. Лучшим решением, вероятно, было бы определить
протокол с определенным представлением целых чисел, строк,
и т. д., отформатируйте вывод в это представление и проанализируйте его
для вашего вклада. Таким образом, он все еще будет работать, даже если один из
процессы это 64 бита, а остальные 32.
Других решений пока нет …