teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答が中途半端な状態で送信されてしまったので修正

2021/01/16 04:29

投稿

angel_p_57
angel_p_57

スコア1681

answer CHANGED
@@ -6,7 +6,8 @@
6
6
 
7
7
  具体的には、manを見て使い方を探るしかない気がします。
8
8
  例えば [semop(2)のmanページ](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/semop.2.html) には、「セマフォの値が0になるのを待って1に変える」というサンプルが載っています。
9
- これを利用する「セマフォの値が0なら共有メモリを読み/きして良い、dその操作の間邪魔が入らないよう一時的セマフォ値を1にしておく(操作が終わったら0戻す)」という方法で、お互いに排他制御が可能です。
9
+ これは2操作同時の例のでちょっと多いですが、1操作だけにして「セマフォの値が0なら共有メモリ良い、だか0でければ0なるまで待つ、共有メモリへ書き込みが終わったら読んでいいことが分かるよう1に変える)」という方法で、排他制御が可能です。
10
+ ※読み込み側は逆に、1になるのを待ってから読み込み、終わったら0に変えるという感じ
10
11
 
11
12
  なお、セマフォの初期化については注意が必要です。プログラム起動的に順序関係がある ( 起動コマンド順が、という意味ではなくて、片一方からもう一方を posix_spawn/fork+exec するような順序の意味 ) なら良いですが、どっちが初期化するべきか、もう初期化されているのか、判断する必要があるからです。
12
13
  それについては [semget(2)のmanページ](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/semget.2.html)の「セマフォの初期化」を参考にどうぞ。