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

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值