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

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