⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pv.c

📁 linux编程 操作系统试验报告
💻 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 + -