Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Compartir memoria entre aplicaciones

En este ejemplo se muestra cómo implementar dos procesos independientes que se comunican entre sí escribiendo y leyendo desde un archivo compartido.MATLAB® Comparten el archivo asignando parte de su espacio de memoria a una ubicación común en el archivo. Una operación de escritura en el mapa de memoria perteneciente al primer proceso se puede leer desde el mapa que pertenece a la segunda, y viceversa.

Un proceso (en ejecución) escribe un mensaje en el archivo a través de su mapa de memoria.MATLABsend.m También escribe la longitud del mensaje en el byte 1 del archivo, que sirve como medio para notificar al otro proceso que hay un mensaje disponible. El segundo proceso (en ejecución) supervisa el byte 1 y, al verlo establecido, muestra el mensaje recibido, lo pone en mayúsculas y vuelve a hacer eco del mensaje al remitente.answer.m

Antes de ejecutar el ejemplo, copie las funciones en archivos y en el directorio de trabajo actual.sendanswersend.manswer.m

La función de envío

Esta función le pide que escriba texto y, a continuación, mediante la asignación de memoria, pasa el texto a otra instancia de la que está ejecutando la función.MATLABanswer

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

La respuesta function

La función inicia un servidor que, mediante la asignación de memoria, observa un mensaje.answersend Cuando se recibe el mensaje, reemplaza el mensaje con una versión en mayúsculas de él y envía este nuevo mensaje a.answersend Para usar, llámalo sin entradas.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

Ejecutar el ejemplo

Para ver cómo se ve el ejemplo cuando se ejecuta, primero, inicie dos sesiones separadas en el mismo sistema informático.MATLAB Llame a la función sin entradas en una sesión.sendMATLAB Llame a la función en la otra sesión, para crear un mapa en cada una de las memorias de los procesos al archivo común.answer

Ejecutar en la primera sesión.sendMATLAB

send
Enter text (or RETURN to end):

Ejecutar en la segunda sesión.answerMATLAB

answer
ANSWER server is awaiting message

A continuación, escriba un mensaje en el símbolo del sistema que muestra la función. escribe el mensaje en el archivo compartido.sendMATLAB La segunda sesión, que ejecuta la función, bucles en el byte 1 del archivo compartido y, cuando se escribe el byte, lee el mensaje del archivo a través de su mapa de memoria.MATLABanswersendanswer La función, a continuación, coloca el mensaje en mayúsculas y lo escribe de nuevo en el archivo y (a la espera de una respuesta) lee el mensaje y lo muestra.answersend

escribe un mensaje y lee la respuesta en mayúsculas.send

Hello. Is there anybody out there?
response from ANSWER is: HELLO. IS THERE ANYBODY OUT THERE? Enter text (or RETURN to end): 

Lee el mensaje.answersend

Received message from SEND: Hello.  Is there anybody out there?

Introduzca un segundo mensaje en la pantalla de solicitud por la función. escribe el segundo mensaje en el archivo.sendsend

I received your reply.
response from ANSWER is: I RECEIVED YOUR REPLY. Enter text (or RETURN to end):

Lee el segundo mensaje, ponerlo en mayúsculas y, a continuación, escribe el mensaje en el archivo.answer

Received message from SEND: I received your reply.

En la primera instancia de, pulse para salir del ejemplo.MATLABEntrar

Terminating SEND function.