zoukankan      html  css  js  c++  java
  • c信号量操作demo

    #include <stdio.h>
    #include <string.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
    
    // union semun {
    //   int val;
    //   struct semid_ds *buf;
    //   unsigned short *array;
    //   struct seminfo *__buf;
    // };
    
    int P(int semid, int semnum) {
      struct sembuf sops={semnum, -1, SEM_UNDO};
      return (semop(semid, &sops, 1));
    }
    
    int V(int semid, int semnum) {
      struct sembuf sops = {semnum, +1, SEM_UNDO};
      return (semop(semid, &sops, 1));
    }
    
    void test2();
    
    int main(int argc, char **argv){
      printf("argc:%d, argv:%s
    ", argc, *argv);
      test2();
      return 0;
    }
    
    void test2(){
      int key;
      int semid,ret;
      union semun arg;
      struct sembuf semop;
      int flag;
    
      key = ftok("/tmp", 0x66);
      arg.val = 3;
      if (key < 0) {
        perror("ftok key error");
      }
    
      semid = semget(key, 3, IPC_CREAT | 0600);
      if(semid == -1) {
        perror("create semget error");
      }
    
      //对0号信号量设置为初始值
      ret = semctl(semid, 0, SETVAL, arg);
      printf("ret:%d
    ", ret);
      if(ret < 0) {
        perror("ctl sem error");
        semctl(semid, 0, IPC_RMID, arg);
      }
    
      //取0号信号量的值
      ret = semctl(semid, 0, GETVAL, arg);
      printf("after semctl setval sem[0].val=[%d]
    ", ret);
      
      //P操作
      flag = P(semid, 0);
      flag = P(semid, 0);
      ret = semctl(semid, 0, GETVAL, arg);
      printf("after P sem[0].val=[%d]
    ",ret);
    
      //V操作
      if (V(semid, 0) < 0) {
        perror("V operator error");
      }
      if (V(semid, 0) < 0) {
        perror("V operator error");
      }
      ret = semctl(semid, 0, GETVAL, arg);
      printf("after v 操作 sem[0].val=%d
    ", ret);
    }
  • 相关阅读:
    学习进度条54
    学习进度条53
    学习进度条52
    学习进度条51
    学习进度条50
    学习进度条49
    学习进度条48
    学习进度条47
    学习进度条45
    线程池中的阻塞队列选择
  • 原文地址:https://www.cnblogs.com/luckygxf/p/12008170.html
Copyright © 2011-2022 走看看