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;
    }
    
  • 相关阅读:
    1130
    Oracle 数据库常用操作语句大全
    Oracle用sys登陆报:ORA-28009:connection as sys should be as sysdba
    导出数据报ORA-39002: 操作无效 ORA-39070: 无法打开日志文件。 ORA-39087: 目录名 DUMP_DIR 无效
    SGI STL源码stl_bvector.h分析
    SGI STL源码stl_vector.h分析
    CGI 萃取技术 __type_traits
    迭代器iterator和traits编程技法
    智能指针分析及auto_ptr源码
    C++深拷贝和浅拷贝细节理解
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384206.html
Copyright © 2011-2022 走看看