Обмен данными между процессами в Linux - PullRequest
2 голосов
/ 18 августа 2011

В моем приложении у меня есть процесс, который разветвляет дочерний элемент, скажем child1, и этот дочерний процесс записывает огромный двоичный файл на диск и завершается. Затем родительский процесс разветвляется на другой дочерний процесс child2, который читает этот огромный файл для дальнейшей обработки.

Вывод файлов и повторная загрузка делают мое приложение медленным, и я думаю о возможном способы избежать дискового ввода-вывода полностью. Возможные способы, которые я определил, это ram-disk или tmpfs. Могу ли я как-то реализовать ram-disk или tmpfs из моего приложения? Или есть еще способ полностью избежать дискового ввода-вывода и надежной отправки данных между процессами.

Ответы [ 7 ]

3 голосов
/ 18 августа 2011

Создайте анонимную область разделяемой памяти перед разветвлением, и тогда все потомки смогут использовать ее после разветвления:

char *shared = mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);

Помните, что вам понадобится какой-то механизм синхронизации при совместном использовании памяти. Один из способов сделать это - поместить мьютекс или семафор в область общей памяти.

3 голосов
/ 18 августа 2011

Если два подпроцесса не работают одновременно, конвейеры или сокеты не будут работать для вас - их буферы будут слишком малы для «огромного двоичного файла», и первый процесс будет блокировать ожидание чего-либо для чтенияданные.

В таком случае вам скорее понадобится какая-то общая память.Вы можете использовать API общей памяти SysV IPC, API общей памяти POSIX (который внутренне использует tmpfs в последних версиях Linux) или использовать файлы в файловой системе tmpfs (обычно монтируемой в / dev / shm, иногда в / tmp) напрямую.

1 голос
/ 18 августа 2011

Вы можете использовать каналы, сокеты и воспользоваться sendfile() или splice() возможностями ядра Linux (они могут избежать копирования данных).

1 голос
/ 18 августа 2011

A именованная труба - это именно то, что вы хотите. Вы можете записывать в него данные и считывать их, как будто это файл, но нет необходимости хранить их на диске.

0 голосов
/ 09 января 2017

Как и в вашем случае, 1-й дочерний процесс child1 завершается до появления child2, поэтому обмен данными через сокеты или использование неназванных каналов не поможет,

Но общая память сделает эту работу: Создайте сегмент общей памяти с разрешением на чтение для всех в child1 и выполните задачу дампа файлов в этой общей памяти, В child2 присоедините сегмент общей памяти к текущему пространству процесса и прочитайте выгруженные данные.

0 голосов
/ 18 августа 2011

Вы можете передавать данные между процессами, используя каналы. Здесь - хороший краткий обзор и пример реализации.

0 голосов
/ 18 августа 2011

Создает два процесса и позволяет им передавать данные через сокеты.TCP будет легче начать, но если вы хотите немного большей эффективности, используйте Unix Domain Sockets.Это предполагает, что вы не заботитесь о данных, записываемых на диск как таковые.

...