我编写了一个简单的程序,该程序创建一个子进程并在其中打印一些消息:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
sem_t *init;
int main()
{
init=sem_open("/mysem", O_CREAT, 0644, 1);
pid_t c,c2;
c=fork();
if(c==0){
sem_wait(init);
for(int i=0;i<5;i++){
printf("critical1 \n");
}
}}
我读到sem_wait会检查信号量的值,如果它大于0则递减并继续操作,如果它为0,它将一直停留在那里直到该值增加。所以在将信号量的值初始化为1之后,我希望sem_wait能继续正常运行并且不会阻止该程序。但是,在这种情况下,该程序不打印任何内容并终止(而不仅仅是暂停)。
答案 0 :(得分:3)
这里的问题是posix信号量在程序运行期间是持久的。第一次运行时,它会起作用。后续运行将忽略初始化值,因为信号量已经存在,因此将其保持为零。尝试执行此修改,该修改在程序结束时取消链接信号灯。请注意,由于您的计算机上可能存在信号量,因此它可能在您第一次运行时不起作用。它将在后续执行中起作用:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
sem_t *init;
int main()
{
init=sem_open("/mysem", O_CREAT, 0644, 1);
pid_t c,c2;
c=fork();
if(c==0)
{
printf("before sem_wait()\n");
sem_wait(init);
printf("after sem_wait()\n");
for(int i=0;i<5;i++)
{
printf("critical1 \n");
}
sem_close(init);
}
else
{
sleep(5);
printf("main() exiting.\n");
sem_close(init);
sem_unlink("/mysem");
}
}