(の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ファイルはすぐに削除されますが、セマフォ自体が削除されていない、セマフォへのすべてのオープンはまだ正常にそれを使用することができます。近くにすべてのセマフォセマフォ、カーネル本当に削除セマフォまでオープン。
奔走
動作結果を交互に実行するプロセスに見ることができる、自己通電が可変である使用。