• pv操作二


    在上一篇共享内存的基础上加上pv操作,也就是 A 进程去写 的时候要加上P 写完了 加个 V

    pvread.cpp

    #include "public.h"

    union semun
    {
     int val;
     struct semid_ds *buf;
     unsigned short *array;
     struct seminfo *__buf;
    };

    int main()
    {

     SNode student;
     char buffer[20];
     pid_t pid=0;
     int i=1;
     int ret=0;

     
     //嵌入式信号量代码
     union semun mysemun;
     struct sembuf mysembuf;
     int sem_no =0;
     //创建信号
     sem_no=semget(SEM_KEY,SEM_NUMBER,SEM_FLAG);
     if (sem_no==-1)
     {
      printf("fail to semget SEM_KEY=%d \n",SEM_KEY);
      exit(1);
     }
     //进行p操作准备执行关键代码
     mysembuf.sem_num=SEM_INDEX;
     mysembuf.sem_op=-1;
     mysembuf.sem_flg=SEM_UNDO;
     ret=semop(sem_no,&mysembuf,1);
     if (ret==-1)
     {
      printf("fail to call semop p op\n");
     }
     mem_no=shmget(MEM_KEY,10*MEM_SIZE,MEM_FLAG);
     //共享内存的周地址映射到本进程
     pstudent=(StuNodes)shmat(mem_no,NULL,0);
     //保留开始的位置方便后续读取
     pstudent_first=pstudent;
     pstudent_first2=pstudent;
     //共享内存中读取数据

     printf("开始从共享内存中读取数据。。。\n");
     for (i=0;i<10;i++)
     {
      printf("student.no = %d student.username %s \n",pstudent_first->no,pstudent_first2->username);
      pstudent_first++;
      sleep(1);
     }
     //卸载共享内存
     if (shmdt(pstudent_first2)==-1)
     {
      printf("fail to dattach share memory\n");
      
     }
     //printf("press any key to remove share momory...\n");
     //getchar();
     
     //删除共享内存
     if (shmctl(mem_no,IPC_RMID,0)==-1)
     {
      printf("fail to IPC_RMID\n");
     }
     
     
     
     
     
     //关键代码执行完了之后,做一个v操作让别的进程的p
     //能够进去
     mysembuf.sem_num=SEM_INDEX;
     mysembuf.sem_op=1;
     mysembuf.sem_flg=SEM_UNDO;
     ret=semop(sem_no,&mysembuf,1);
     if (ret==-1)
     {
      printf("fail to semop v op\n");
     }
     printf("press anykey to exit \n");
     getchar();
     //删除sem_no
     semctl(sem_no,SEM_INDEX,IPC_RMID);

     return 0;
    }

  • 相关阅读:
    数据库设计中的四个范式(转)
    几个SQL
    一个整形数组,找其中第二大值
    装箱与拆箱
    继承与隐藏方法
    C++/C# 最基本的Marshal和Ptr
    C++/C#结构体转化-传string给C++
    C++/C#结构体转化-二维数组-bytes To Strings
    C# 懒人常用异步方法
    jsplumb 的初次使用
  • 原文地址:https://www.cnblogs.com/newlist/p/2261621.html
Copyright © 2020-2023  润新知