ipc — C ++, безопасно ли static_cast аннулировать * и обратно через процессы?

У меня есть два идентичных двоичных файла, работающих одновременно в системе Linux (разные аргументы командной строки, поэтому они делают разные вещи). В одном процессе я записываю объект в некоторую область общей памяти; и в другом процессе я получаю объект с правильным размером и получаю указатель на него как void*, а также static_cast это указатель оригинального типа.

Это считается безопасным? Объект не обязательно POD.

0

Решение

Это небезопасно, потому что вы не можете memcpy объект, который не trivially_copyable. Например, вы не можете переместить / скопировать std::vector вызывая memcopy, это может привести к множеству проблем. Однако вы можете создать объект в сегменте общей памяти. Я настоятельно рекомендую рассмотреть буст-межпроцесс даже если вы не используете его, примеры дадут вам представление о том, что возможно: http://www.boost.org/doc/libs/1_63_0/doc/html/interprocess/sharedmemorybetweenprocesses.html.

2

Другие решения

язык ничего не говорит об общей памяти, так что в этом смысле вопрос не подлежит обсуждению. На практике ограничение на тривиально копируемое является правильной идеей; поскольку разрешено давать такие объекты значения через memcpyкомпилятор, как правило, не будет выполнять каких-либо неудачных оптимизаций.

Вы должны следить за загрузкой памяти по разным адресам в разных процессах. Если объект содержит нет указателей, это можно игнорировать. Если это так, вы можете захотеть offset_ptr.

0

По вопросам рекламы [email protected]