В этом примере показано, как реализовать два отдельных процесса 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.