当前位置: 技术问答>linux和unix
信号PV操作,初学者的疑问
来源: 互联网 发布时间:2016-11-22
本文导语: 我在自学LINUX,在写信号PV操作时发现程序只能正确执行一遍,下一遍则会报错。需重启计算机才能正确执行,不知道是为什么。希望大家帮忙看一下问题出在哪里了。 /*PV.c*/ #include #include #include #include #include #includ...
我在自学LINUX,在写信号PV操作时发现程序只能正确执行一遍,下一遍则会报错。需重启计算机才能正确执行,不知道是为什么。希望大家帮忙看一下问题出在哪里了。
/*PV.c*/
#include
#include
#include
#include
#include
#include
#include
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
/*创建信号量*/
int init_sem(int semid,int val){
union semun sem_union;
sem_union.val = val;
if(semctl(semid,0,SETVAL,sem_union) == -1)
{
perror("semctl");
return -1;
}
printf("信号:%d,创建信号量成功!n",semid);
return 0;
}
/*删除信号量*/
int del_sem(int semid){
union semun sem_union;
if(semctl(semid,0,IPC_RMID,sem_union) == -1)
{
perror("semctl");
return -1;
}
printf("信号:%d,删除信号量成功!n",semid);
return 0;
}
/*P操作*/
int sem_P(int semid){
int rs;
struct sembuf sops;
sops.sem_num = 0;
sops.sem_op = -1;
sops.sem_flg = SEM_UNDO;
if((rs = semop(semid,&sops,1)) == -1)
{
perror("semop sem_P");
return -1;
}else{
return rs;
}
}
/*V操作*/
int sem_V(int semid){
int rs;
struct sembuf sops;
sops.sem_num = 0;
sops.sem_op = +1;
sops.sem_flg = SEM_UNDO;
if((rs = semop(semid,&sops,1)) == -1)
{
perror("semop sem_V");
return -1;
}else{
return rs;
}
}
void main()
{
int semid,i;
key_t key;
pid_t pid;
key = ftok(".",'1');
semget(key,1,0777 | IPC_CREAT);
init_sem(semid,0);
pid = fork();
if(pid == -1)
{
perror("fork");
}
if(pid == 0)
{
printf("子进程执行5秒n");
for(i = 0;i