[英]Use of sem_wait in a program
我編寫了這個簡單的程序來創建子進程並在其中打印一些消息:
#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");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.