Доброго времени суток. Требуется сделать обмен данными между двумя процессами посредством отображаемого на память файла (один процесс создает отображение, и ждет пока другой не закинет туда чего, нить). Пытаюсь сделать это так: сервер - создает отображение файла и ждет клиента. Код | #include <iostream> #include <string> #include <fcntl.h> #include <sys/mman.h> #include <errno.h>
int main(int argc, char * * argv) { std::cout << "Mapped file name = [./../mf]" << std::endl; std::string mapped_file_name; std::cin >> mapped_file_name; //Try open file. int mapped_file_handle = open(mapped_file_name.c_str(), O_RDWR);
if (mapped_file_handle < 0) { std::cout << "ERROR!!! File not opened!!!" << std::endl; return 1; } //Try map file. void * file_map = mmap(0, 10 * getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, mapped_file_handle, 0); if (file_map == MAP_FAILED) { std::cout << "ERROR!!! File not mapped!!!" << std::endl << "Error code = " << errno << std::endl; return 1; } close(mapped_file_handle); memset(file_map, 0, 10 * getpagesize()); //Wait client. int * int_file_map = (int *)file_map; while (*int_file_map == 0) { sleep(5); } sleep(5); //Read matrix size. int matrix_size = *int_file_map; std::cout << matrix_size; //Alloc memory for matrixs. float * * first_matrix = new float * [matrix_size]; float * * second_matrix = new float * [matrix_size]; for (int index = 0; index < matrix_size; ++index) { first_matrix[index] = new float [matrix_size]; second_matrix[index] = new float [matrix_size]; } //Unmap file. munmap(file_map, 10 * getpagesize()); //Free memory. for (int index = 0; index < matrix_size; ++index) { delete [] first_matrix[index]; delete [] second_matrix[index]; } delete [] first_matrix; delete [] second_matrix; return 0; }
|
клиент - запускается после сервера, отображает файл на память и пишет туда данные: Код | #include <iostream> #include <string> #include <sys/mman.h> #include <fcntl.h>
int main(int argc, char * * argv) { std::cout << "Mapped file name = [./../mf]" << std::endl; std::string mapped_file_name; std::cin >> mapped_file_name; //Try open file. int mapped_file_handle = open(mapped_file_name.c_str(), O_RDWR | O_TRUNC); if (mapped_file_handle < 0) { std::cout << "ERROR!!! File not opened!!!" << std::endl; return 1; } //Try map file. void * file_map = mmap(NULL, 10 * getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, mapped_file_handle, 0); if (file_map == MAP_FAILED) { std::cout << "ERROR!!! File not mapped!!!" << std::endl; return 1; } close(mapped_file_handle); int matrix_size = 0; std::cout << "Matrix size = "; std::cin >> matrix_size; //Alloc memory for matrixs. float * * first_matrix = new float * [matrix_size]; float * * second_matrix = new float * [matrix_size]; for (int index = 0; index < matrix_size; ++index) { first_matrix[index] = new float [matrix_size]; second_matrix[index] = new float [matrix_size]; } //Read matrixs. std::cout << "Enter first matrix:" << std::endl; for (int line_number = 0; line_number < matrix_size; ++line_number) { for (int column_number = 0; column_number < matrix_size; ++column_number) { std::cin >> first_matrix[line_number][column_number]; } } std::cout << "Enter second matrix:" << std::endl; for (int line_number = 0; line_number < matrix_size; ++line_number) { for (int column_number = 0; column_number < matrix_size; ++column_number) { std::cin >> second_matrix[line_number][column_number]; } } //Write matrix to file_map. int * int_file_map = (int *)file_map; *int_file_map = matrix_size; ++int_file_map; float * float_file_map = (float *)int_file_map;
for (int line_number = 0; line_number < matrix_size; ++line_number) { for (int column_number = 0; column_number < matrix_size; ++column_number) { *float_file_map = first_matrix[line_number][column_number]; ++float_file_map; } } for (int line_number = 0; line_number < matrix_size; ++line_number) { for (int column_number = 0; column_number < matrix_size; ++column_number) { *float_file_map = second_matrix[line_number][column_number]; ++float_file_map; } } //Unmap file. munmap(file_map, 10 * getpagesize()); //Free memory. for (int index = 0; index < matrix_size; ++index) { delete [] first_matrix[index]; delete [] second_matrix[index]; } delete [] first_matrix; delete [] second_matrix; }
|
(жирным выделил запись в память) После запуска сервера он спокойно себе висит и ждет записи в отображаемый файл, после заапуска клиента и сервер и клиет завершаются с сообщением "Ошибка шины" Соответственно вопрос: Что я делаю не так и как надо? Заранее спасибо.
|