私はプロセス同期が必要なプロジェクトに取り組んでいます。私が持っている問題は、使用しているサマフォがすべてのプロセスで共有されていないように見えるということです。ローカル変数と同様に動作します。これは単純化されたコードですが、同じ問題を示しています。C - セマフォーがすべてのプロセスで共有されていません
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <semaphore.h>
#include <fcntl.h>
sem_t sem_1; //Global variable (semaphore).
int main(){
sem_init(&sem_1, 1, 0); //semaphore starts with 0
pid_t child_pid_or_zero = fork(); //process fork
if (child_pid_or_zero < 0){
perror("fork() error");
exit (2);
}
if (child_pid_or_zero != 0){
sem_wait(&sem_1); //decrement to -1 and waits
printf("I am the parent %d, my child is %d.\n",getpid(),child_pid_or_zero);
}else{
printf("i am child\n");
sem_post(&sem_1); //increments
}
return 0;
}
親プロセスは待機信号を決して通過しません。私は両方のプロセスにmupltiple sem_post()を追加し、sem_getvalue()で値を表示しようとしましたが、印刷された数字は共有されていないようでした(すべてのプロセスが独自のセマフォをインクリメントしました)。
ありがとうございました。
'fork'の後、親と子は別々のアドレス空間を持ちます。それらは 'fork'の直後のアドレス空間の正確な(多かれ少なかれ)コピーですが、それ以降の変更は他のものには見られません。 – kaylum
'sem_init'のマニュアルページを読むか、[共有メモリを使ってプロセス間でセマフォを共有する方法](http://stackoverflow.com/questions/8359322/how-to-share-semaphores-between-processes-using-共有メモリ?rq = 1) – kaylum