exponenta event banner

Совместное использование памяти приложениями

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