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;
    }
    
  • 相关阅读:
    20191028 Codeforces Round #534 (Div. 1)
    20191028 牛客网CSP-S Round2019-1
    UVA11464 Even Parity 搜索+递推
    CSP2019-S1 游记
    LG2921 [USACO2008DEC]Trick or Treat on the Farm 内向基环树
    bzoj 2002 Bounce 弹飞绵羊
    快速乘,快速幂,十进制快速幂,矩阵快速幂
    2019牛客暑期多校训练营(第五场) generator 1
    2019牛客暑期多校训练营(第五场) digits 2
    hdu 4714 Tree2cycle
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384206.html
Copyright © 2011-2022 走看看