Передача данных между исполняемыми файлами

У меня есть два исполняемых файла, написанные на C ++ для Windows. Я генерирую некоторые данные в одном и хочу вызвать другой исполняемый файл для обработки этих данных. Я мог бы записать данные в файл, а затем прочитать их в другом исполняемом файле, но это кажется довольно дорогим с точки зрения дискового ввода-вывода. Какой лучший способ сделать это? Это кажется достаточно простым вопросом, но Google просто не помогает!

Допустим, данные имеют размер около 100 МБ и генерируются полностью перед отправкой (т. Е. Потоковая передача не требуется).

Ответы, которые работают при смешивании 32-битных и 64-битных процессов, получают бонусные баллы.

5

Решение

Если ваши процессы могут легко записывать и читать из файла, просто продолжайте. Создайте файл с CreateFile и пометить его как временный & разделяемый. Windows использует эту подсказку для задержки физической записи, но все семантика файла все еще соблюдается. Поскольку ваш файл занимает всего 100 МБ и активно используется, Windows почти наверняка сможет полностью сохранить свое содержимое в оперативной памяти.

4

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

Ты можешь использовать Boost.MPI. Это от Boost, который имеет высокий стандарт качества, и пример кода кажется довольно явным:

http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point

// The following program uses two MPI processes to write "Hello, world!"// to the screen (hello_world.cpp):

int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;

if (world.rank() == 0) {
world.send(1, 0, std::string("Hello"));
std::string msg;
world.recv(1, 1, msg);
std::cout << msg << "!" << std::endl;
} else {
std::string msg;
world.recv(0, 0, msg);
std::cout << msg << ", ";
std::cout.flush();
world.send(0, 1, std::string("world"));
}
return 0;
}
3

Предполагая, что вы хотите идти только в одном направлении (то есть вам не нужно получать данные BACK от дочернего процесса), вы можете использовать _popen(). Вы записываете свои данные в канал, а дочерний процесс читает данные из stdin,

Если вам нужен двунаправленный поток данных, вам нужно будет использовать два канала, один в качестве входных данных и один в качестве выходных, и вам нужно будет настроить схему подключения дочернего процесса к этим каналам [вы все еще можете настроить stdin / stdout — путь к данным, но вы также можете использовать пару именованных каналов].

Третий вариант Общая память область, край. Я никогда не делал этого в Windows, но принцип почти такой же, как в Linux [и много лет назад в OS / 2]:
1. Создайте область памяти с заданным именем в родительском процессе.
2. Дочерний процесс открывает ту же область памяти.
3. Данные хранятся родительским процессом и читаются дочерним процессом.
4. При необходимости семафоры или аналогичные объекты могут использоваться для оповещения о завершении / результатах, готовых / и т.д.

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