我在以下程序中遇到错误.我想演示两个进程如何使用信号量共享变量.谁能指导我?
我无法调试错误......
#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;
}
Run Code Online (Sandbox Code Playgroud)
Bar*_*mar 23
您的基础知识错误,程序将无法运行,因此请完成基础知识并重写程序.
您必须做出的一些更正是:
1)您必须创建一个信号量类型的变量
sem_t semvar;
Run Code Online (Sandbox Code Playgroud)
2)函数sem_wait(),sem_post()需要信号量变量,但是你传递了信号量id,这没有任何意义.
sem_wait(&semvar);
//your critical section code
sem_post(&semvar);
Run Code Online (Sandbox Code Playgroud)
3)您正在将信号量传递给 初始化sem_wait()和sem_post()不初始化.在使用它之前,必须将其初始化为1(在您的情况下),否则您将遇到死锁.
ret = semctl( semid, 1, SETVAL, sem);
if (ret == 1)
perror("Semaphore failed to initialize");
Run Code Online (Sandbox Code Playgroud)
从手册页学习信号量API并完成此示例.
小智 15
您的代码的基本问题是您混合了两个API.不幸的是,在线资源并没有很好地指出这一点,但在类UNIX系统上有两个信号量API:
查看上面的代码,您使用了System V API中的semget(),并尝试发布来自POSIX API的sem_post().它们不可能混合使用.
要确定您想要的信号量API,您没有那么多优秀的资源.最简单的是史蒂文斯的"Unix网络编程".您可能感兴趣的部分是Vol#2.
这两个API出乎意料地不同.两者都支持教科书风格的信号量,但System V API中有一些好处和坏点值得一提: