Linux 进程通信-信号量

头文件

#include<sys/types.h>  
#include <sys/sem.h>  

union semun {
    int val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
};

int create_sem(){
    key_t key(ftok("..", 2));
    int semid = semget(key, 1, IPC_CREAT | IPC_EXCL | 0600);    //Create one sem

    if(semid < 0){
        print("Crate sem Error");
        return -1;
    }

    print("semid:", semid);

    semun semun1;
    semun1.val = 1;
    semctl(semid, 0, SETVAL, semun1);   //init

    return semid;
}

int get_sem(){
    key_t key(ftok("..", 2));
    int semid = semget(key, 0, 0);   //Reference a sem,Set nsems to 0

    if(semid < 0){
        print("Get sem Error");
        return -1;
    }

    return semid;
}

void P_sem(int semid){ //get source
    sembuf P_sembuf;

    P_sembuf.sem_num = 0;   //index of信号量,你想操作的信号量的下标
    P_sembuf.sem_op = -1;
    P_sembuf.sem_flg = SEM_UNDO;

    semop(semid, &P_sembuf, 1);
}

void V_sem(int semid){ //release source
    sembuf V_sembuf;

    V_sembuf.sem_num = 0;
    V_sembuf.sem_op = 1;
    V_sembuf.sem_flg = SEM_UNDO;

    semop(semid, &V_sembuf, 1);
}

void sem_test(){
    pid_t pid;

    if((pid = fork()) > 0){
        int semid = create_sem();

        for(int i = 0; i < 3; i++){
            P_sem(semid);
            print("A");
            fflush(stdout);
            sleep(1);
            V_sem(semid);
        }

        cout << semctl(semid, 0, IPC_RMID); //delete sem
        wait(0);
    }else if(pid == 0){
        int semid = get_sem();

        for(int i = 0; i < 3; i++){
            P_sem(semid);
            print("B");
            fflush(stdout);
            sleep(1);
            V_sem(semid);
        }
    }

}

更多:https://www.cnblogs.com/lenomirei/p/5649792.html

猜你喜欢

转载自blog.csdn.net/m_n_n/article/details/79835596