我在使用Semaphores在C语言系统上工作时遇到了很多困难。
我的申请流程如下:
sem_open
和一个通用名称来打开信号量。如果我在分叉之前创建信号量,它可以正常工作。但是,要求阻止我这样做。当我第二次尝试拨打sem_open
时,我收到“权限被拒绝”错误(通过errno
)。
是否可以以任何方式执行此操作?或者有没有办法在一个进程中打开信号量并使用共享内存机制与子进程共享它?
答案 0 :(得分:9)
在标志中使用O_CREAT时,不要忘记指定mode和value参数。 这是一个有效的例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/wait.h>
static void parent(void)
{
sem_t * sem_id;
sem_id=sem_open("mysem", O_CREAT, 0600, 0);
if(sem_id == SEM_FAILED) {
perror("parent sem_open");
return;
}
printf("waiting for child\n");
if(sem_wait(sem_id) < 0) {
perror("sem_wait");
}
}
static void child(void)
{
sem_t * sem_id;
sem_id=sem_open("mysem", O_CREAT, 0600, 0);
if(sem_id == SEM_FAILED) {
perror("child sem_open");
return;
}
printf("Posting for parent\n");
if(sem_post(sem_id) < 0) {
perror("sem_post");
}
}
int main(int argc, char *argv[])
{
pid_t pid;
pid=fork();
if(pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
if(!pid) {
child();
} else {
int status;
parent();
wait(&status);
}
return 0;
}
答案 1 :(得分:7)
您使用的是sem_open的4参数还是2参数版本?
确保使用4参数版本并使用允许其他进程打开信号量的模式。假设所有进程都归同一个用户所有,则模式为0600(S_IRUSR | S_IWUSR
)即可。
您可能还需要验证umask是否未屏蔽任何必要的权限。