C - 信号量未在所有进程中共享
C - Semaphore not shared over all processes
我正在做一个需要进程同步的项目。我遇到的问题是我使用的 samaphore 似乎并未在所有进程之间共享。它的行为类似于局部变量。这是一个简化的代码,但演示了同样的问题:
#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;
}
父进程永远无法克服等待信号。我尝试向两个进程添加多个 sem_post() 并使用 sem_getvalue() 打印值,打印的数字似乎没有共享(每个进程都增加了自己的信号量)。
感谢您的帮助。
POSIX 非常不清楚 sem_init
的 pshared 参数(第二个参数)是如何工作的。 Linux 手册页解释得更好:
If pshared is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory
分配该内存并将信号量放在那里是您的责任。这不是系统会帮你做的。
信号量需要在一些共享内存中,而不是在文件全局区域中。
因此需要使用:shm_open()
或shm_get()
或mmap()
来拥有一些共享内存。
传递给子进程的数据设置为'copyonwrite'所以当子进程调用函数时:sem_post()
,数据被复制,
正如我所说,程序需要一些共享内存,并且信号量需要位于该共享内存中。
我正在做一个需要进程同步的项目。我遇到的问题是我使用的 samaphore 似乎并未在所有进程之间共享。它的行为类似于局部变量。这是一个简化的代码,但演示了同样的问题:
#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;
}
父进程永远无法克服等待信号。我尝试向两个进程添加多个 sem_post() 并使用 sem_getvalue() 打印值,打印的数字似乎没有共享(每个进程都增加了自己的信号量)。
感谢您的帮助。
POSIX 非常不清楚 sem_init
的 pshared 参数(第二个参数)是如何工作的。 Linux 手册页解释得更好:
If pshared is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory
分配该内存并将信号量放在那里是您的责任。这不是系统会帮你做的。
信号量需要在一些共享内存中,而不是在文件全局区域中。
因此需要使用:shm_open()
或shm_get()
或mmap()
来拥有一些共享内存。
传递给子进程的数据设置为'copyonwrite'所以当子进程调用函数时:sem_post()
,数据被复制,
正如我所说,程序需要一些共享内存,并且信号量需要位于该共享内存中。