ライト
光(セマフォ)または異なる内部スレッド同期プロセスの間にシステムVセマフォ機構は、1つ以上の光の集まりで与えられる異なるプロセス間(光回数が複数同時に設定された動作を可能にします)。その各々は別個のタリーランプです。そして、単一の光のPosixカウンティングセマフォを参照してください。
Linuxでは、私たちは、指示に従ってライトを見ることができます
ipcs -s
また、次のコマンドのライトを削除することができます
ipcrm -s 【semid】
まず、相関関数が点灯
1、semgetからの機能
関数原型
int semget(key_t key, int nsems, int semflg);
必要なヘッダファイル
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
戻り値
成功:戻り値は、ファイルを作成したセマフォIDが
失敗しました:-1
パラメータ
のキー識別は、キーが点灯(IDファイルのようなファイル名です):0 / IPC_PRIVATEの
NSEMS:ライトはライトの数に焦点を当てが含ま
emflgを:セマフォセットへのアクセスを
ここで、IPC_PRIVATE、関数のsemget()のためのキー値は、新たな信号光を作成する際に、この方法で作成したライトは、一般的に、プロセス間通信間の遺伝的関係を使用し、我々は一般的ftokを通じて非親族ですこの関数は、キーを取得します
キーはftok取得される(1)
ftok関数プロトタイプ
key_t ftok(const char *pathname,int proj_id);
必要なヘッダファイル
#include <sys/types.h>
#include <sys/ipc.h>
戻り値
成功:戻り値は、キーが
失敗しました:-1
パラメータは、
ファイル名を指定してそのパス名(ファイル名がすでに存在している)、現在のディレクトリの一般的な使用
PROJ_IDは、8ビットの整数である子のシリアル番号、です。すなわち、0〜255の範囲、
(2)キーがIPC_PRIVATEであります
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
int main()
{
system("ipcs -s");
int semid = semget(IPC_PRIVATE,3,0777);
if(semid == -1)
{
printf("creat semaphore fail\n");
return -1;
}
else
{
printf("creat semphore success, semid = %d\n",semid);
}
system("ipcs -s");
return 0;
}
2、のsemctl(ライトコントロール(初期設定/削除)
関数原型
int semctl ( int semid, int semnum, int cmd…/*union semun arg*/);
必要なヘッダファイル
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/ipc.h>
戻り値
成功:0は
失敗しました:-1
パラメータは
semidのセマフォセットIDを
semnum:ID信号光で動作するように設定
CMD:
GETVALは:セマフォの値を取得し、戻り値が値が得られる
SETVAL:セマフォ設定値は、第四パラメータ連邦使用する必要がある
システムから:IPC_RMIDをライトのセット削除する
組合をsemun引数:それはコンソーシアムである
あなたはそれが簡単に設定cmdをしますライトの数をセマフォ操作を削除すると、このパラメータが省略された書き込みまたはNULLの書き込みをしていない場合
、それはライトを設定したい場合、値を連邦の独自の定義を持っています
連邦
連邦valが交通信号のセマフォ初期化動作の値を処理することで、あなたは最初のセマフォの初期化信号光の値の前に労働組合を定義する必要があり、とvalを割り当てるには
union semun
{
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO(Linux-specific) */
};
値は、動作例を初期化します:
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
int main()
{
system("ipcs -s");
int semid = semget(IPC_PRIVATE,3,0777);
if(semid == -1)
{
printf("creat semaphore fail\n");
return -1;
}
else
{
printf("creat semaphore success, semid = %d\n",semid);
}
union semun mysem[3];
mysem[0].val = 1;
mysem[1].val = 2;
mysem[2].val = 3;
semctl(semid,0,SETVAL,mysem[0]); // init first semaphore
semctl(semid,1,SETVAL,mysem[1]); // init second semaphore
semctl(semid,2,SETVAL,mysem[2]); // init third semaphore
semctl(semid,0,IPC_RMID,NULL);
system("ipcs -s");
return 0;
}
削除セマフォ操作など:
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
int main()
{
system("ipcs -s");
int semid = semget(IPC_PRIVATE,3,0777);
if(semid == -1)
{
printf("creat semaphore fail\n");
return -1;
}
else
{
printf("creat semaphore success, semid = %d\n",semid);
}
int ctlret = semctl(semid,1,IPC_RMID,NULL);
if(ctlret == -1)
{
printf("delete semaphore fail\n");
return -2;
}
else
{
printf("delete semaphore success, semid = %d\n",semid);
}
system("ipcs -s");
return 0;
}
3、のsemop(光がセマフォP / Vの動作が設定されています)
関数原型
int semop ( int semid, struct sembuf *opsptr, size_t nops);
必要なヘッダファイル
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/ipc.h>
戻り値
成功:0は
失敗しました:-1
パラメータは、
semidの:ライトIDの
opsptr:構造の
操作を構造でセマフォに
struct sembuf
{
unsigned short sem_num; //要操作的信号灯的编号
short sem_op; // 0 : 等待,直到信号灯的值变成0 // 1 : 释放资源,V操作 // -1 : 分配资源,P操作
short sem_flg; //0(阻塞),IPC_NOWAIT, SEM_UNDO
};
たとえば、次のsemop(semidの、&mysembuf、 1);
アプリケーションリソース演算P:
セマフォ操作mysembuf.sem_num =所望の数;
mysembuf.sem_op = -1;
mysembuf.sem_flg = 0;
リリースリソースV操作:
mysembuf.sem_num操作セマフォ=所望の数;
mysembuf.sem_op = 1;
mysembuf.sem_flg = 0。
動作させるライトの数:NOPを
たとえば:
光によってメイン楽しいランニング後に実行するマルチスレッドプロセスである
-lpthread追加するには、Linuxのコンパイル時間:注
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <pthread.h>
union semun
{
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO(Linux-specific) */
}semun;
int semid;
union semun mysem;
struct sembuf mybuf;
void *fun(void *arg)
{
int i;
mybuf.sem_op = -1;
semop(semid,&mybuf,1);
for(i=0;i<5;i++)
{
sleep(1);
printf("B\n");
}
}
int main()
{
int i;
semid = semget(IPC_PRIVATE,3,0777);
if(semid == -1)
{
printf("creat semaphore fail\n");
return -1;
}
else
{
printf("creat semaphore success, semid = %d\n",semid);
}
mysem.val = 0;
semctl(semid,1,SETVAL,mysem);
mybuf.sem_num = 1;
mybuf.sem_flg = 0;
pthread_t id;
int ret = pthread_create(&id,NULL,fun,NULL);
if(ret == 0)
{
printf("creat pthread success\n");
}
else
{
printf("creat pthread fail,ret = %d\n",ret);
}
for(i=0;i<5;i++)
{
sleep(1);
printf("A\n");
}
mybuf.sem_op = 1;
semop(semid,&mybuf,1);
while(1);
return 0;
}
両者の間に、プロセス間通信
1、親族ニュースレターがあります:
ライトの順で父と息子の間に手続きを実装します
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
union semun
{
int val;
};
int main()
{
int semid = semget(IPC_PRIVATE,3,0777);
if(semid == -1)
{
printf("creat semaphore fail\n");
return -1;
}
else
{
printf("creat semaphore success, semid = %d\n",semid);
}
system("ipcs -s");
union semun mysem;
mysem.val = 0;
int ctlret = semctl(semid,1,SETVAL,mysem);
if(ctlret == -1)
{
printf("set semaphore val fail\n");
return -2;
}
else
{
printf("set semaphore val success\n");
}
struct sembuf mybuf;
mybuf.sem_num = 1;
mybuf.sem_flg = 0;
pid_t pid = fork();
if(pid < 0)
{
printf("fork fail\n");
return -3;
}
if(pid>0)
{
int i = 10;
while(i)
{
printf("A\n");
i--;
}
mybuf.sem_op = 1;
semop(semid,&mybuf,1);
while(1);
}
if(pid==0)
{
int i = 10;
mybuf.sem_op = -1;
semop(semid,&mybuf,1);
while(i)
{
printf("B\n");
i--;
}
}
return 0;
}