Этот пример показывает, как реализовать два отдельных процесса 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
Функция 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
, циклы на байте 1 из совместно используемого файла и, когда байт записан send
, answer
, читает сообщение из файла с помощью его карты распределения памяти. Функция 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.