Unix_Linuxオペレーティングシステム-メモDay 9(信号量)
4472 ワード
Day9
しんごうりょう
マルチプロセス間の共有リソースを管理するカーネル・メンテナンスのカウント数
たとえば、変数nによってリソースの数が表され、プロセスが1つのリソースを独占したい場合、nの値は-1(または複数)であり、nの値が0(減算が足りない)に等しい場合、プロセスはnの値が減算されてから起動されるまでブロックされ、リソースが使用された後、nの値は+1(または複数)である
int semget(key_t key, int nsems, int semflg);
int semop(int semid, struct sembuf *sops, size_t nsops);
struct sembuf{
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
IPC_NOWAIT // ,
SEM_UNDO // ,
}
int semtimedop(int semid, struct sembuf *sops, size_t nsops, const struct timespec *timeout);
struct timespec{
__time_t tv_sec;
long int tv_nsec;
}
int semctl(int semid, int semnum, int cmd, ...);
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) */
};
struct seminfo {
int semmap; /* Number of entries in semaphore
map; unused within kernel */
int semmni; /* Maximum number of semaphore sets */
int semmns; /* Maximum number of semaphores in all
semaphore sets */
int semmnu; /* System-wide maximum number of undo
structures; unused within kernel */
int semmsl; /* Maximum number of semaphores in a
set */
int semopm; /* Maximum number of operations for
semop(2) */
int semume; /* Maximum number of undo entries per
process; unused within kernel */
int semusz; /* Size of struct sem_undo */
int semvmx; /* Maximum semaphore value */
int semaem; /* Max. value that can be recorded for
semaphore adjustment (SEM_UNDO) */
};
#include
#include
#include
#include
#include
#include
int main(){
//
int semid = semget(ftok(".",100),1,IPC_CREAT|0644);
if(0 > semid){
perror("semget");
return -1;
}
//
if(semctl(semid,0,SETVAL,5)){
perror("semctl");
return -1;
}
printf(" 5 ");
// ,
for(int i=0;i<10;i++){
if(0 == fork()){
//
struct sembuf buf = {0,-1,0};
semop(semid,&nuf,1);
printf("%u: , %d
",getpid(),semctl(semid,0,GETVAL));
sleep(rand()%20+5);//
//
buf.sem_op = 1;
semop(semid,&buf,1)
printf("%u:
",getpid());
//
exit(0);
}
}
while(-1 != wait(NULL));
//
semctl(semid,0,IPC_RMID);
}
プログラミングモデル:
プロセスA
プロセスB
信号量の作成
semget
取得信号量
イニシャル信号量
semctl
…
加減信号量
semop
加減信号量
削除信号量
semctl
…
注意:信号量はカウントするためのもので、必ずリソース対応が必要です.
IPCコマンド
IPCオブジェクトの表示
ipc -m
ipc -q
ipc -s
ipc -a
IPCオブジェクトの削除
ipcrm -m ID
ipcrm -q ID
ipcrm -s ID