通信方式--信号量的操作

来源:互联网 发布:青岛永诚网络 编辑:程序博客网 时间:2024/06/03 14:26
#include<stdio.h>#include<unistd.h>#include<sys/sem.h>#include<sys/types.h>#include<sys/ipc.h>#include<stdlib.h>union semun  //man  semctl{    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 semget(key_t key,int nsems,int semflg);//创建信号量  //              关键字   信号个数    操作标志int main(){    key_t sem_key;     sem_key = ftok("mysem",0xff);//创建关键字    if(sem_key == -1)    {        perror("ftok");        exit(1);    }    else    {        printf("sem_key = 0x%x\n",sem_key); //以十六进制打印    }    int sem_id = semget(sem_key,2,IPC_CREAT|IPC_EXCL|0755);    if(sem_id == -1)    {        perror("semget");        exit(1);    }    else    {        printf("sem_id = %d\n",sem_id);    } union semun init_val, init_val1;//初始化操作         init_val.val = 2;         init_val1.val = 3;         semctl(sem_id, 0, SETVAL, init_val);//删除信号集         semctl(sem_id, 1, SETVAL, init_val1);    struct sembuf  op[2];     op[0].sem_num = 0;     op[0].sem_op = -1;   //>0  ==0  <0     op[0].sem_flg = 0;   //SEM_UNDO     op[1].sem_num = 1;     op[1].sem_op = -2;     op[1].sem_flg = 0;    semop(sem_id, op, 2);    int sem_val = semctl(sem_id, 0, GETVAL);    printf("sem_val = %d\n",sem_val);    sem_val = semctl(sem_id, 1, GETVAL);    printf ("sem_val1 = %d\n",sem_val);    return 0;}