Передача объектов с использованием Pipes в C ++ - PullRequest
0 голосов
/ 02 апреля 2020
class Proc
{
public:
    string schedulingAlgo;
    string procName;
    int quantum;
    int arrivalTime;
    int burstTime;
}

Это мой класс, объект которого я хочу передать другому процессу, используя каналы, используя вызов sys write

write(fd_admit_write,(char*)&procs, sizeof((char*)&procs));

А в другом процессе я пытаюсь прочитать и преобразовать его обратно в тип Pro c с использованием этого

char buffer[15];
read(fd_admit_read,buffer,15);
Proc *pp = reinterpret_cast<Proc *>(buffer);

Я знаю, что метод, который я использовал для преобразования, подойдет, потому что я попробовал его независимо, но когда я использую его в каналах, вывод pp искажается.

1 Ответ

1 голос
/ 03 апреля 2020

Процессы не разделяют память (как правило). Они не видят память друг друга. То есть вы не можете иметь указатель на адрес памяти в другом процессе.

Насколько я понимаю, вы отправляете Proc* другому процессу. Хотя Proc* указывает на действительный объект Proc в процессе отправки, он будет указывать на неинициализированную память в процессе получения. Вы должны фактически отправить все данные, необходимые для создания объекта Proc, и создать его на стороне получателя.

Даже если вы отправите сам объект Proc вместо указателя на него, он будет не работает, потому что у него есть строковая переменная-член, а строка содержит указатель на свои данные (кроме случаев небольшой оптимизации строки).

Вы можете использовать хороший двоичный протокол, такой как msgpack или реализуйте свою собственную сериализацию / десериализацию на основе ваших потребностей.

...