gpt4 book ai didi

c - 信号量实现

转载 作者:太空狗 更新时间:2023-10-29 17:14:09 25 4
gpt4 key购买 nike

我在以下程序中遇到错误。我想演示两个进程如何使用信号量共享一个变量。谁能指导我?

我无法调试错误...

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<semaphore.h>
int main()
{
int pid,mutex=1;
int semid; /* semid of semaphore set */
key_t key = 1234; /* key to pass to semget() */
int nsems = 1; /* nsems to pass to semget() */
semid=semget(key,nsems,IPC_CREAT|0666);
if (semid<0)
{
perror("Semaphore creation failed ");
}
if ((pid = fork()) < 0)
{
perror("fork");
return 1;
}
else if(pid==0)
{
sem_wait(&semid);
printf("IN CHILD PROCESS :\n");
mutex++;
printf("value of shared variable =%d",mutex);
sem_post(&semid);
return 0;
}
sem_wait(&semid);
printf("IN PARENT PROCESS :\n");
mutex--;
printf("value of shared variable =%d",mutex);
sem_post(&semid);
return 0;
}

最佳答案

你的基础知识是错误的,程序将无法运行,所以通过基础知识并重写程序。

您必须进行的一些更正是:

1) 你必须创建一个信号量类型的变量

sem_t semvar;

2) sem_wait()sem_post() 函数需要信号量变量,但您传递的是信号量 ID,这是没有意义的。

sem_wait(&semvar);
//your critical section code
sem_post(&semvar);

3) 您将信号量传递给 sem_wait()sem_post() 而未对其进行初始化。在使用它之前,您必须将其初始化为 1(在您的情况下),否则您将遇到死锁。

ret = semctl( semid, 1, SETVAL, sem);
if (ret == 1)
perror("Semaphore failed to initialize");

从手册页中研究信号量 API 并浏览此 example .

关于c - 信号量实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182328/

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