実現したいこと
2つの子プロセス間でセマフォを使用して変数cntを10にしたいです。
前提
fork, sem_open, sem_wait, sem_post, sem_close, sem_unlinkを使用して、子プロセス間での排他処理を行いたいのですが、上手くいかないのでアドバイスをいただきたいです。
下記のコードだと各子プロセスでcntがインクリメントされてしまい、変数の共有が出来ていない状況です。スレッドではなくプロセスを使用したいのですが、やはり記憶領域を共有するスレッドでないと排他処理は出来ないのでしょうか?
発生している問題・エラーメッセージ
cnt 1 cnt 2 cnt 3 cnt 4 cnt 5 cnt 1 cnt 2 cnt 3 cnt 4 cnt 5
該当のソースコード
C
1# include <stdio.h> 2# include <string.h> 3# include <stdlib.h> 4# include <unistd.h> 5# include <pthread.h> 6# include <stdbool.h> 7# include <semaphore.h> 8# include <sys/time.h> 9# include <sys/types.h> 10# include <sys/stat.h> 11# include <sys/wait.h> 12# include <fcntl.h> 13# include <signal.h> 14 15void func(sem_t *sem, int *cnt) 16{ 17 int i = 0; 18 sem_wait(sem); 19 while(i < 5) 20 { 21 (*cnt)++; 22 i++; 23 printf("cnt %d\n",*cnt); 24 } 25 sem_post(sem); 26 exit(0); 27} 28 29int main() 30{ 31 pid_t pid; 32 pid_t pid2; 33 sem_t *sem; 34 int *status; 35 int cnt; 36 37 cnt = 0; 38 sem_unlink("hello"); 39 sem = sem_open("hello", O_CREAT, 0644, 1); 40 pid = fork(); 41 if(pid == 0) 42 func(sem, &cnt); 43 pid2 = fork(); 44 if(pid2 == 0) 45 func(sem, &cnt); 46 waitpid(pid, status, 0); 47 waitpid(pid2, status, 0); 48 sem_close(sem); 49 return(0); 50}
試したこと
sem_waitをwhileの直後にすると、デッドロックになってしまうのか、cnt 1を出力後に止まってしまいます。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/04 13:38
2023/10/04 14:15
2023/10/04 16:17