zoukankan      html  css  js  c++  java
  • Linux _sem 信号量 V_P

    main1.c

    #include <stdlib.h>
    #include <stdio.h>
    
    int main(void) 
    {
        int i;
    
        for (i=0; i<5; i++) {
    
            /* ƒ£ƒ‚¡ŸΩÁ«¯----begin */
            printf("Process(%d) In
    ", getpid());       
            sleep(1);
            printf("Process(%d) Out
    ", getpid());
                  /* ƒ£ƒ‚¡ŸΩÁ«¯----end */ 
    
            sleep(1);
        }
    
        return 0;
    }

    main2.c

    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)                         
    #else
        union semun {
            int val;                             
            struct semid_ds *buf;    
            unsigned short int *array; 
            struct seminfo *__buf;  
        };
    #endif     
    
    static sem_initial(int semid) 
    {
        int ret;
    
        union semun semun;
        semun.val = 1;
        ret = semctl(semid, 0, SETVAL, semun);
        if (ret == -1) {
            fprintf(stderr, "semctl failed!
    ");
        }
    
        return ret;
    }
    
    static int  sem_p(int semid)
    {
        int ret;
    
        struct sembuf sembuf;
        sembuf.sem_op = -1;
        sembuf.sem_num = 0;
        sembuf.sem_flg = SEM_UNDO;
        ret = semop(semid, &sembuf, 1); 
        if (ret == -1) {
            fprintf(stderr, "sem_p failed!
    ");
        }
    
        return ret;
    }
    
    static int  sem_v(int semid)
    {
        int ret;
    
        struct sembuf sembuf;
        sembuf.sem_op = 1;
        sembuf.sem_num = 0;
        sembuf.sem_flg = SEM_UNDO;
        ret = semop(semid, &sembuf, 1); 
        if (ret == -1) {
            fprintf(stderr, "sem_v failed!
    ");
        }
    
        return ret;
    }
    
    int main(int argc, char* argv[]) 
    {
        int i;
        int ret;
        int semid;
    
        /* ªÒ»°–≈∫≈¡ø */
        semid = semget((key_t)1234, 1, 0666 | IPC_CREAT);
        if (semid == -1) {
            printf("semget failed!
    ");
            exit(1);
        }
    
        /* ≥ı ºªØ–≈∫≈¡ø */
        if (argc > 1) {
            ret = sem_initial(semid);
            if (ret == -1) {
                exit(1);
            }
        }
    
        for (i=0; i<5; i++) {
    
            if (sem_p(semid) == -1) {
                exit(1);
            }
    
            /* ƒ£ƒ‚¡ŸΩÁ«¯----begin */
            printf("Process(%d) In
    ", getpid());       
            sleep(1);
            printf("Process(%d) Out
    ", getpid());
                  /* ƒ£ƒ‚¡ŸΩÁ«¯----end */ 
    
            if (sem_v(semid) == -1) {
                exit(1);
            }
    
            sleep(1);
        }
    
        /* …æ≥˝–≈∫≈¡ø */
    
        return 0;
    }
    
  • 相关阅读:
    机器学习入门实践——线性回归&非线性回归&mnist手写体识别
    基于OpenCV的摄像头采集印刷体数字识别
    使用rviz实现本地计算机绘制机器人路径
    从0开始的FreeRTOS(4)
    从0开始的FreeRTOS(3)
    从0开始的FreeRTOS(2)
    从0开始的FreeRTOS(1)
    Robomaster电控入门(8)RTOS
    Robomaster电控入门(7)双轴云台控制
    计算机与网络课程设计开发纪要
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384206.html
Copyright © 2011-2022 走看看