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

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