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

来源:互联网 发布:软件英文怎么说 编辑:程序博客网 时间:2024/06/08 22:27

上节课对信号量的相关函数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");}
原创粉丝点击