В этом примере показано, как реализовать два отдельных MATLAB® процессы, которые взаимодействуют друг с другом путем записи и чтения из общего файла. Они совместно используют файл, сопоставляя часть пространства памяти в общее место в файле. Операция записи в карту памяти, принадлежащую первому процессу, может быть считана с карты, принадлежащей второму, и наоборот.
Один процесс MATLAB (выполняется send.m
) записывает сообщение в файл через его карту памяти. Он также записывает длину сообщения в байт 1 в файле, который служит средством уведомления другого процесса о том, что сообщение доступно. Второй процесс (текущий answer.m
) контролирует байт 1 и, увидев его установленный, отображает полученное сообщение, помещает его в верхний регистр и повторяет сообщение обратно отправителю.
Перед выполнением примера скопируйте send
и answer
функций в файлы send.m
и answer.m
в вашей текущей рабочей директории.
Эта функция предлагает вам ввести текст, а затем, используя размещение в ОЗУ, передает текст другому образцу MATLAB, который запускает answer
функция.
function send % Interactively send a message to ANSWER using memmapfile class. filename = fullfile(tempdir, 'talk_answer.dat'); % Create the communications file if it is not already there. if ~exist(filename, 'file') [f, msg] = fopen(filename, 'wb'); if f ~= -1 fwrite(f, zeros(1,256), 'uint8'); fclose(f); else error('MATLAB:demo:send:cannotOpenFile', ... 'Cannot open file "%s": %s.', filename, msg); end end % Memory map the file. m = memmapfile(filename, 'Writable', true, 'Format', 'uint8'); while true % Set first byte to zero, indicating a message is not % yet ready. m.Data(1) = 0; str = input('Enter text (or RETURN to end): ', 's'); len = length(str); if (len == 0) disp('Terminating SEND function.') break; end % Warn if the message is longer than 255 characters. if len > 255 warning('ml:ml','SEND input will be truncated to 255 characters.'); end str = str(1:min(len,255)); % Limit message to 255 characters. len = length(str); % Update len if str has been truncated. % Update the file via the memory map. m.Data(2:len+1) = str; m.Data(1)=len; % Wait until the first byte is set back to zero, % indicating that a response is available. while (m.Data(1) ~= 0) pause(.25); end % Display the response. disp('response from ANSWER is:') disp(char(m.Data(2:len+1))') end
The answer
функция запускает сервер, который, используя размещение в ОЗУ, следит за сообщением от send
. Когда сообщение будет получено, answer
заменяет сообщение на заглавную версию и отправляет это новое сообщение обратно в send
. Как использовать answer
, вызовите его без входов.
function answer % Respond to SEND using memmapfile class. disp('ANSWER server is awaiting message'); filename = fullfile(tempdir, 'talk_answer.dat'); % Create the communications file if it is not already there. if ~exist(filename, 'file') [f, msg] = fopen(filename, 'wb'); if f ~= -1 fwrite(f, zeros(1,256), 'uint8'); fclose(f); else error('MATLAB:demo:answer:cannotOpenFile', ... 'Cannot open file "%s": %s.', filename, msg); end end % Memory map the file. m = memmapfile(filename, 'Writable', true, 'Format', 'uint8'); while true % Wait until the first byte is not zero. while m.Data(1) == 0 pause(.25); end % The first byte now contains the length of the message. % Get it from m. msg = char(m.Data(2:1+double(m.Data(1))))'; % Display the message. disp('Received message from SEND:') disp(msg) % Transform the message to all uppercase. m.Data(2:1+double(m.Data(1))) = upper(msg); % Signal to SEND that the response is ready. m.Data(1) = 0; end
Чтобы увидеть, как выглядит пример при запуске, сначала запустите два отдельных сеансов работы с MATLAB в одной компьютерной системе. Вызовите send
функция без входов в одном сеансе работы с MATLAB. Вызовите answer
функция в другом сеансе, чтобы создать карту в памяти каждого из процессов в общий файл.
Выполняйте send
в первом сеансе работы с MATLAB.
send
Enter text (or RETURN to end):
Выполняйте answer
во втором сеансе работы с MATLAB.
answer
ANSWER server is awaiting message
Далее введите сообщение в строке приглашения, отображаемой send
функция. MATLAB записывает сообщение в общий файл. Второй сеанс работы с MATLAB, выполняющий answer
function, циклы на байте 1 общего файла и, когда байт записан send
, answer
считывает сообщение из файла через его карту памяти. The answer
затем функция помещает сообщение в верхний регистр и записывает его обратно в файл, и send
(в ожидании ответа) считывает сообщение и отображает его.
send
записывает сообщение и читает заглавный ответ.
Hello. Is there anybody out there?
response from ANSWER is: HELLO. IS THERE ANYBODY OUT THERE? Enter text (or RETURN to end):
answer
читает сообщение от send
.
Received message from SEND: Hello. Is there anybody out there?
Введите второе сообщение при отображении приглашения send
функция. send
записывает второе сообщение в файл.
I received your reply.
response from ANSWER is: I RECEIVED YOUR REPLY. Enter text (or RETURN to end):
answer
считывает второе сообщение, помещает его в верхний регистр, а затем записывает сообщение в файл.
Received message from SEND: I received your reply.
В первом образце MATLAB нажмите Enter, чтобы выйти из примера.
Terminating SEND function.