📄 pv.c
字号:
#include<sys/ipc.h>
#include<sys/sem.h>
#include<unistd.h>
/*
struct sem
{
ushort semval;
pid_t sempid;
ushort semncnt;
ushort semzcnt;
};
*/
/*
struct sembuf
{
ushort sem_num;
short sem_op;
sem_flag;
};
*/
union semun
{
int val;
struct semid_ds *buf;
ushort *array;
};
int sem(key_t key)
{
union semun sem;
int semid;
sem.val=1;
semid=semget(key,5,IPC_CREAT|0666);//获得信号量ID
if(semid==-1)
{
printf("create semaphore error!\n");
exit(-1);
}
semctl(semid,0,SETVAL,sem);//赋初值
semctl(semid,1,SETVAL,sem);
semctl(semid,2,SETVAL,sem);
semctl(semid,3,SETVAL,sem);
semctl(semid,4,SETVAL,sem);
return semid;
}
int P(int semid,int num1,int num2)//P操作,sem_num减1
{
struct sembuf psembuf[2];
psembuf[0].sem_op=-1;
psembuf[0].sem_flg=SEM_UNDO;
psembuf[0].sem_num=num1;
psembuf[1].sem_op=-1;
psembuf[1].sem_flg=SEM_UNDO;
psembuf[1].sem_num=num2;
semop(semid,psembuf,2);//自动执行信号量集合上的操作数组
return 0;
}
int V(int semid,int num1,int num2)//V操作,sem_num加1
{
struct sembuf vsembuf[2];
vsembuf[0].sem_op=+1;
vsembuf[0].sem_flg=SEM_UNDO;
vsembuf[0].sem_num=num1;
vsembuf[1].sem_op=+1;
vsembuf[1].sem_flg=SEM_UNDO;
vsembuf[1].sem_num=num2;
semop(semid,vsembuf,2);
return 0;
}
int main()
{
int pid[5];
key_t key;
int semid;
int i;
int j;
key=ftok("/home/st02/st02042/EXP",0);//转化为关键字
semid=sem(key);//获得信号量ID
if((pid[0]=fork())!=0)//创建5个子进程
if((pid[1]=fork())!=0)
if((pid[2]=fork())!=0)
if((pid[3]=fork())!=0)
pid[4]=fork();
for(i=0;i<=1;i++)//测试用,循环两次
{
for(j=0;j<=4;j++)
if(pid[j]==0)
{
P(semid,(j-1+5)%5,j);
printf("[%d]eating!\n",j+1);
sleep(1);
V(semid,(j-1+5)%5,j);
printf("[%d]thinking!\n",j+1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -