Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxのプロセス間通信共有メモリモード

共有メモリモード:物理メモリの一部を取り、それを複数のプロセスとして共有します。

共有メモリは、プロセス間でデータを共有するための最速の方法で、プロセスは共有メモリ領域にデータを書き込みます。

共有メモリの実装手順:

まず、共有メモリを作成し、shmget関数を使用します。

次に、共有メモリをマップし、作成した共有メモリを特定のプロセススペースにマップします。shmat関数を使用します。

Linuxのプロセス間通信共有メモリモード

共有メモリモード:物理メモリの一部を取り、それを複数のプロセスとして共有します。

共有メモリは、プロセス間でデータを共有するための最速の方法で、プロセスは共有メモリ領域にデータを書き込みます。

共有メモリの実装手順:

まず、共有メモリを作成し、shmget関数を使用します。

次に、共有メモリをマップし、作成した共有メモリを特定のプロセススペースにマップします。shmat関数を使用します。

  
IPC_EXCL:カーネル内に同じキー値とキーを持つ共有メモリがない場合は新しいメッセージキューを作成し、そのような共有メモリがある場合はエラーを報告します。
戻り値:成功した場合はメモリの識別子を返します。次に-1が返され、エラーの理由が共有メモリの呼び出しプロセスのアドレス空間shmatへのマッピングに存在します。

void * shmat(int shmid、const void * shmaddr、int shmflg)< Br>

msqid:共有メモリ識別子

shmaddr:共有メモリがプロセスメモリアドレスのどこにあるかを指定し、カーネルに独自の適切なアドレス位置を決定させるには直接NULLを指定します。

shmflg:SHM_RDONLY読み取り専用モード、その他は読み取り/書き込みモード

関数の戻り値:正常に終了した場合は、接続されている共有メモリアドレスを返し、エラーの場合は-1を返します。共有メモリ接続shmdtを切断します。

intshmdt(const void * shmaddr)

機能:受信shmaddr、接続共有メモリの開始アドレス。 0、エラーは-1を返します。エラーの原因はエラーにあります。

親子プロセス間通信の例:

#include

#include

#include

#include

#include

#include

int main(int argc、char ** argv){

if(argc< 2){//共有データの入力が必要です

printf(「共有データを入力してください。n」);

exit(-1);

}

intshmid;

shmid = shmget(0,1024、IPC_CREAT);

if(shmid == -1){//共有メモリの申請に失敗しました。

printf(" creatinghare memory failed.n");

exit(-1);

}

if(fork()){//親プロセス間

char * p_shmaddr;

p_shmaddr = shmat(shmid、NULL、0); //親プロセス内のアドレスにマップする

memset(p_shmaddr、0、1024); //共有メモリを初期化する

strcpy(p_shmaddr、argv [1]); //共有データを共有メモリにコピーする

wait(NULL); ////子プロセスの終了を待つ

exit(0);

}

else {

sleep(2); //親プロセスがデータを書き込むのを待っている

char * c_shmaddr;

c_shmaddr = shmat(shmid、) NULL、0); //子プロセス内のアドレスに、具体的にはカーネルによってマップされます。

printf(" theshare data is:%sn"、c_shmaddr); //子プロセスは共有データを出力します

exit(0);

}

}


Copyright © Windowsの知識 All Rights Reserved