我正在開發一個需要進程同步的項目。我遇到的問題是我使用的信號燈似乎並未在所有進程中共享。它的行爲與局部變量類似。這是一個簡化代碼,但演示了同樣的問題: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之後的(或多或少)地址空間的副本,但其他任何後續更改都不會被另一個看到。 – kaylum
閱讀'sem_init'手冊頁或者看到像[如何在使用共享內存的進程之間共享信號量]這樣的問題(http://stackoverflow.com/questions/8359322/how-to-share-semaphores-between-processes-using-共享內存?rq = 1) – kaylum