进程间通信(3)-信号量的使用

上节课对信号量的相关函数semget() semctl() semop()做了了解(换不是很理解)这里用一个小例子来运用这三个函数进一步对信号量进行了解
目标实现:AB 进程使用同一信号量,
初始化型号量为0,
————-> B进程先进行p操作,
当用户输入OK时,
进行v操作, ———– > B进程输出1~100素数

PV操作相当一个计数器,将系统资源与当前资源做对比,当 系统资源大于等于我所需要的资源 ,我的进程就可以运行,如果不满足就堵塞, (比如说,你来的时候,资源数为1,而你恰好需要一个资源,那此时你得到了该资源,然后资源数变为1,我来的时候,资源数就是0了,但是我需要1个资源,资源不足,那我就会阻塞,直到信号量的值大于等于我需要的资源数,我才会被唤醒)

信号量的创建和相关操作的封装

void sem_get()//创建信号量集
{
    semid = semget((key_t)1234, 1, 0664);

    if(semid == -1)
    {
        semid = semget((key_t)1234, 1, 0664 | IPC_CREAT);
        assert(semid != -1);

        union semun v;
        v.val = 0;
        semctl(semid, 1, SETVAL, v);        
    }
}

void sem_p()//p操作
{
    struct sembuf op;
    op.sem_num = 0;
    op.sem_op = -1;
    op.sem_flg = SEM_UNDO;
    semop(semid, &op, 1);
}
void sem_v()//v操作
{
    struct sembuf op;
    op.sem_num = 0;
    op.sem_op = 1;
    op.sem_flg = SEM_UNDO;
    semop(semid, &op, 1);
}
void sem_del()//删除信号
{
    semctl(semid, 0, IPC_RMID, NULL);
}

A进程

void main()
{
  sem_get(1234);
  printf("A start\n");
  char ar[100]={0};
  while(1)
  {
     printf("input:");fflush(stdout);
     fgets(ar,100,stdin);
     if(strncmp(ar,"OK",2)==NULL)
     {
      sem_v();
     }
     if(strncmp(ar,"end",3)==NULL)
     {
      exit(0);
     }
  }
}

B进程

void main()
{
    sem_get(1234);
    printf("B start\n");
    sem_p();
    int i=1;
    for(;i<100;++i)
    {
      int j=2;
      for(;j<i;++j)
      {
        if(i%j==0)break;
      }
      if(i==j || i==1)
         printf("%d ",i);
     }
     printf("\n");
}

猜你喜欢

转载自blog.csdn.net/s_yj_q/article/details/78230138
今日推荐