gpt4 book ai didi

c - 在程序中使用 sem_wait

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:30 26 4
gpt4 key购买 nike

我编写了这个创建子进程并在其中打印一些消息的简单程序:

#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 到正常继续并且不阻止程序。但是,在这种情况下,该程序不打印任何内容并终止(不仅仅是暂停)。我错过了什么?

最佳答案

这里的问题是 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");
}
}

关于c - 在程序中使用 sem_wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56308978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com