信号量的不解之处

semop函数的不理解:
函数原型:
int semop(int semid, struct sembuf *sops, unsigned nsops);
semid:创建的semid值,semget中返回
struct sembuf *sops:实际是这样的 struct sembuf sops[],传递一个数组
unsigned nsops:表示数组的个数。即我们要操作几个信号量。

***************************************************/
int semctl(int semid, int semnum, int cmd, …);
semnum:表示信号量集合内的某个成员(数组下标)。
cmd:SETVAL

           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) */
           };

这里我们主要设置value值(几把钥匙)

/***************************************************/
int semget(key_t key, int nsems, int semflg);
nsems:表示要创建几个信号量集合

代码中:
我创建了5个信号量集合,但是semop同时操作两个信号量集,这样会阻塞不继续往下执行,有什么问题呢?
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/ipc.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*/
};
int set_p(int semid)
{
        struct sembuf p[2];// = {{0,-1,0},{0,-1,0}};//array index
        p[0].sem_num = 0;
        p[0].sem_op = -1;
        p[0].sem_flg = 0;
        p[1].sem_num = 0;
        p[1].sem_op = -1;
        p[1].sem_flg = 0;
        semop(semid,p,2);//means how many key 
}
int set_v(int semid)
{
        struct sembuf p[2];// = {{0,1,0},{0,1,0}};// array index
        p[0].sem_num = 0;
        p[0].sem_op = 1;
        p[0].sem_flg = 0;
        p[1].sem_num = 0;
        p[1].sem_op = 1;
        p[1].sem_flg = 0;
        semop(semid,p,2);
}
int main()
{
        int semid,ret,i;
        semid = semget(0x1234,5,0666|IPC_CREAT); // 5 means how many sem you want to creat
        if(semid == -1)
        {
                perror("semget error.\n");
        }
        union semun test;
        test.val = 1; // means how many key
        ret = semctl(semid,0,SETVAL,test);//0 means which array(sem jihe),you want to use.array[0],[1],[2].[3],[4]
        ret = semctl(semid,1,SETVAL,test);//1 means which array(sem jihe),you want to use.array[0],[1],[2].[3],[4]
        if(ret < 0)
        {
                perror("semctl error..\n");
        }
        pid_t pid = fork();
        for(i = 0; i < 10; i++)
        {
                set_p(semid);
                printf("my pid is %d \n",pid);
                sleep(1);
                set_v(semid);
        }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值