IPC共有メモリ

(のvforkによって作成されたマルチプロセスを除く)マルチプロセスのプログラムでは、グローバル変数を共有することができない場合でも、各プロセスは、ローカルまたはグローバル変数のコピーを保存し、そして自分自身の使用のためになります。

共有メモリは、メモリ内の共有データへの複数のプロセスを可能にするために、メモリアドレスにファイルをマップされました。

 

 メモリマッピングAPI

書式#include <sysの/ mman.h>
void *型のMMP(void *型addrの、size_tのLEN、int型PROT、int型のフラグ、int型のfd、off_t型オフセット); //呼び出し成功したマッピングされた領域の開始アドレスが返され、エラーがMAP_FAILEDでした

 あなたは、開始アドレスaddrは、プロセス空間にマッピングするシンボルのFDを説明指定することができます。これは、通常はNULLポインタとして指定され、自身の開始アドレスを選択するために、カーネルに語りました。いずれの場合も、この関数の戻り値は、マッピングされたメモリ領域をfdが開始アドレスシンボルに記載されています。

日常的な使用

書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
書式#include <unistd.h>
書式#include <SYS / types.h>に
書式#include <sysの/ stat.h>
書式#include <sysの/ mman.h>
書式#include <fcntl.h>
書式#include <semaphore.h>

#define SEM_NAME "mysem"
INTメイン(int型ARGC、CHAR * ARGV [])
{
	intは、fdがI、nloop、ゼロ= 0;
	int型* ptrは、
	sem_t *ミューテックス。

	もし(のargc!= 3)
		printf( "用法:増分2 <パス名> <#loops> \ n");
	nloop = ATOI(ARGV [2])。

	FD =オープン(ARGV [1]、O_RDWR | O_CREAT、0664)。
	書き込み(FD&ゼロ、はsizeof(int型));
	PTR = MMAP(NULL、はsizeof(int型)、PROT_READ | PROT_WRITE、MAP_SHARED、FD、0);
	クローズ(FD)。

	ミューテックス= sem_open(SEM_NAME、O_CREAT | O_EXCL、0664、1);
	sem_unlink(SEM_NAME)。

	setbuf(STDOUT、NULL);
	(フォーク()== 0)場合
	{
		以下のための式(I = 0、I <nloop; ++ I)
		{
			sem_wait(ミューテックス); //保存Aミューテックス、セマフォ、アトミック操作がブロックしています
			printf( "子:%dの\ n" は、(* PTR)++);
			sem_post(ミューテックス); //ミューテックスセマフォを追加し、アトミック操作がブロックされています
		}
		出口(0);
	}
	以下のための式(I = 0、I <nloop; ++ I)
	{
		sem_wait(ミューテックス)。
		printf( "親は%d \ n" は、(* PTR)++);
		sem_post(ミューテックス)。
	}
	出口(0);
}

 sem_unlink特長

プロセスが名前付きセマフォを作成する場合は、/ dev / shmにファイルsem.xxxを生成します、(それを作成したプロセスを含む)セマフォに開かすべてがカーネルによって、ファイルの参照カウントを増加させ、カウントされます管理。あなたはsem_unlink呼び出す場合は、/ dev / shmを中sem.xxxファイルはすぐに削除されますが、セマフォ自体が削除されていない、セマフォへのすべてのオープンはまだ正常にそれを使用することができます。近くにすべてのセマフォセマフォ、カーネル本当に削除セマフォまでオープン。

奔走

 

 

 

 動作結果を交互に実行するプロセスに見ることができる、自己通電が可変である使用。

おすすめ

転載: www.cnblogs.com/area-h-p/p/11929241.html