C++マルチプロセス信号量

2161 ワード

質問:親プロセスサブプロセスで、親プロセスがサブプロセスと同期するように要求されます.サブプロセスが先に実行され、親プロセスが後に実行される必要があります.
解決方法:信号量メカニズムで、最初の信号量を0に初期化する
親プロセス:
ひりんかいいき
p(s)
りんかいいき
v(s)
ひりんかいいき
サブプロセス:
ひりんかいいき
v(s)
ひりんかいいき
これにより、親プロセスは臨界領域コードを実行する前にp操作を行うが、信号量は0であるため、親プロセスはブロックされる.サブプロセスがv操作を実行して信号量を追加するまで、親プロセスは操作できません.
次は実装コードです
#include
#include
#include
#include
#include
#include
/*     */
union semun{
	int val;
	struct semid_ds *buf;
	unsigned short *array;	
};
/*      */
int init_sem(int sem_id,int init_value);//        
int del_sum(int sem_id);//           
int sem_p(int sem_id);//P    
int sem_v(int sem_id);//V    
int main(){
	pid_t result;
	int sem_id;
	/*       */
	sem_id = semget(ftok(".",'a'),1,0666|IPC_CREAT);
	/*      */
	init_sem(sem_id,0);
	/*  fork  */
	result = fork();
	if(result ==-1){
		perror("fork
"); }else if(result ==0){// printf("Child process will waite for some seconds.....
"); sleep(3); printf("the return value is %d child process id is %d
",result,getpid()); sem_v(sem_id); }else{// sem_p(sem_id); printf("the return value is %d father process id is %d
",result,getpid()); sem_v(sem_id); } exit(0); } // int init_sem(int sem_id,int init_value){ union semun sem_union; sem_union.val = init_value; if(semctl(sem_id,0,SETVAL,sem_union)==-1){ perror("init semaphore"); return -1; } return 0; } // int del_sem(int sem_id){ union semun sem_union; if(semctl(sem_id,0,IPC_RMID,sem_union)==-1){ perror("delete semaphore"); return -1; } } //p int sem_p(int sem_id){ struct sembuf sem_b; sem_b.sem_num = 0; sem_b.sem_op =-1; sem_b.sem_flg = SEM_UNDO; if(semop(sem_id,&sem_b,1)==-1){ perror("P operation"); return -1; } return 0; } //v int sem_v(int sem_id){ struct sembuf sem_b; sem_b.sem_num =0; sem_b.sem_op =1; sem_b.sem_flg =SEM_UNDO; if(semop(sem_id,&sem_b,1)==-1){ perror("V operation"); return -1; } return 0; }