アプリケ,ション間でのメモリの共有
この例では,共有ファイルに対する書き込みと読み取りによって情報を交換する2つの独立したMATLAB®プロセスを実装する方法を説明します。この両方のプロセスでは,メモリ空間の一部をファイル内の共通の場所に対しマッピングすることによってファイルが共有されます。第1のプロセスに属するメモリマップへの書き込み操作は,第2のプロセスに属するマップから読み取ることができ,その逆も可能です。
1 .のmatlabプロセス(send.m
の実行)によって,メモリマップを介してファ。このプロセスではまた,メッセージの長さがファイルの第1バイトに書き込まれ,これはメッセージが利用可能であることをもう一方のプロセスに知らせる方法となります。第2のプロセス(answer.m
の実行)では第1バイトをモニターし,その設定が確認されると受け取ったメッセージを表示し,それを大文字にして送信側にメッセージを送り返します。
この例を実行する前に,関数发送
および回答
を,現在の作業ディレクトリ内のファsend.m
およびanswer.m
にコピ,します。
関数发送
この関数はテキストの入力を求め,メモリマッピングを使用して,そのテキストを関数回答
を実行しているmatlabのもう1のンスタンスに渡します。
函数发送使用memmapfile类交互式地向ANSWER发送消息。文件名= fullfile(tempdir,“talk_answer.dat”);如果通信文件不存在,则创建该通信文件。如果~存在(文件名,“文件”) [f, msg] = fopen(文件名,“白平衡”);如果F ~= -1 fwrite(F, 0 (1,256),“uint8”);文件关闭(f);其他的错误(“MATLAB演示:发送:cannotOpenFile”,...“无法打开文件“%s”:%s。”,文件名,msg);结束结束内存映射文件。M = memmapfile(文件名,可写的,真的,“格式”,“uint8”);而真正的将第一个字节设置为0,表示消息不是准备好了。m.Data(1) = 0;STR = input('输入文本(或返回结束):',“年代”);Len = length(str);如果(len == 0) disp('终止SEND函数。')打破;结束%如果消息长度超过255个字符警告。如果Len > 255警告(ml:毫升的,'发送输入将被截断为255个字符');结束STR = STR (1:min(len,255));将消息限制为255个字符。Len = length(str);如果str被截断,则更新len。通过内存映射更新文件。m.Data(2:len+1) = str;m.Data(1) =兰;等待,直到第一个字节被置零。%表示响应可用。而(m.Data(1) ~= 0) pause(.25);结束显示响应。disp (ANSWER的回答是:) disp (char (m.Data (2: len + 1)”)结束
関数答案
関数回答
では,メモリマッピングを使用して,发送
からのメッセ,ジを監視するサ,バ,を起動します。メッセ,ジを受け取ると,回答
によってメッセ,ジは大文字のバ,ジョンに置き換えられ,この新しいメッセ,ジが发送
に送り返されます。回答
を使用するには,入力引数なしで呼び出します。
函数回答使用memmapfile类响应SEND。disp (“应答服务器正在等待消息”);文件名= fullfile(tempdir,“talk_answer.dat”);如果通信文件不存在,则创建该通信文件。如果~存在(文件名,“文件”) [f, msg] = fopen(文件名,“白平衡”);如果F ~= -1 fwrite(F, 0 (1,256),“uint8”);文件关闭(f);其他的错误(“MATLAB演示:答:cannotOpenFile”,...“无法打开文件“%s”:%s。”,文件名,msg);结束结束内存映射文件。M = memmapfile(文件名,可写的,真的,“格式”,“uint8”);而真正的等待,直到第一个字节不为零。而m.Data(1) == 0 pause(.25);结束第一个字节现在包含消息的长度。%从m得到。msg = char(m.Data(2:1+double(m.Data(1))))';显示消息。disp ('收到来自SEND的消息:') disp(味精)将消息全部转换为大写。m.Data(2:1+double(m.Data(1))) = upper(msg);发送信号,表示响应已经准备就绪。m.Data(1) = 0;结束
例の実行
実行時の例がどのようになるかを確認するために,1つのコンピューターで2つ別々のMATLABセッションを開始します。一方のmatlabセッションで,入力引数を指定せずに関数发送
を呼び出します。もう一方のセッションで関数回答
を呼び出し,共通のファ。
最初のmatlabセッションで发送
を実行します。
发送
输入文本(或RETURN结束):
2番目のmatlabセッションで回答
を実行します。
回答
应答服务器正在等待消息
次に,関数发送
によって表示されるプロンプトでメッセ,ジを入力します。メッセジはmatlabによって共有ファルに書き込まれます。関数回答
を実行している2番目のMATLABセッションでは共有ファイルの第1バイトをループによって監視し,このバイトが发送
によって書き込まれると,回答
ではメモリマップを介してファ▪▪ルからメッセ▪▪ジが読み取られます。次に,関数回答
によってメッセジが大文字に変換されてファルに書き戻され,(応答待となっていた)发送
によってこのメッセ,ジが読み取られて表示されます。
发送
によりメッセ,ジが書き込まれ,大文字の応答が読み取られます。
你好。有人在吗?
ANSWER的响应是:HELLO。有人在吗?输入文本(或RETURN结束):
回答
により发送
からのメッセ,ジが読み取られます。
从SEND收到的消息:你好。有人在吗?
関数发送
によって表示されるプロンプトに2番目のメッセ,ジを入力します。このメッセ,ジは发送
によってファ@ @ルに書き込まれます。
我收到了你的回复。
我收到了你的回复。输入文本(或RETURN结束):
回答
によって2番目のメッセジが読み取られ,大文字に変換されてからファルに書き込まれます。
收到来自SEND的消息:我收到了你的回复。
Matlabの最初のescンスタンスで输入キ,を押して例を終了します。
终止SEND函数。