?? 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 + -