信号量集用于对存在竞争的资源加锁

1.semId=semget(key,nsems,semflg)

  key:为信号量集名称,可以指定为0455等数字,也可以为PC_PRIVATE

  nsems:创建几个信号量

  semflg:创建并给权限,如(IPC_CREAT | 0600);

2.semctl(semId,semnum,cmd,...)//

  2.1初始化信号量集  

  semctl(semId,num,SETVAL,1)  将semId的第num个信号量设置为1;semvalue

  2.2删除信号量集

  semctl(semId,0,IPC_RMID)    删除信号量集semId

  .......

3. 锁的操作

  semop(semId,&buf,1)/////能做则做,不能做则阻塞等待

  锁操作是将要操作的信号放到一个结构体中 struct sembuf   buf;

  buf.sem_num:对第几个信号操作

  buf.sem_op:  有三种情况  大于0(释放资源)   小于0(申请资源)     等于0(等0操作)

  buf.sem_flg:  是否阻塞

  semop(semId,&buf,1);操作1个这样的buf

·

  semtimeop()//能做则做,不能做则阻塞一段时间后返回,常用于超时等待

代码示例

//等零操作:子进程执行10次 父进程执行一次
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>

#define      NR     1

int p_lock(int semId);
void v_unlock(int semId);
void w_zero(int semId);

int main(void)
{
    int semId,ret;
    pid_t pid;

semId=semget(IPC_PRIVATE,NR,0600);
    if(semId==-1)
    {
        perror("semget");
        return 1;
    }
    //init sem value
    ret=semctl(semId,0,SETVAL,0);
    if(ret==-1)
    {
        perror("set sem val");
        semctl(semId,0,IPC_RMID);
        return 2;
    }

//create child process  继承semId
    pid=fork();
    if(pid==-1)
    {
        semctl(semId,0,IPC_RMID);
        perror("fork");
        return 3;
    }
    else if(pid==0)//child
    {
        int count=1;
        while(1)
        {
            p_lock(semId);
            printf("child do %dth\n",count);
            count++;
            sleep(1);
        }
        exit(0);
    }
    //aprent
    while(1)
    {
        w_zero(semId);
        printf("parent do....\n");

v_unlock(semId);
    }

wait(NULL);
 
    semctl(semId,0,IPC_RMID);
    return 0;
}
int p_lock(int semId)
{
    struct sembuf  buf[1];
    buf[0].sem_num=0;//第几个
    buf[0].sem_op =-1;//怎么操作(1.op>0 指释放资源   2.op<0 申请资源  3.op==0等大资源为0)
    buf[0].sem_flg=0; //IPC_NOWAIT

return semop(semId,buf,1);
}

void v_unlock(int semId)
{
    struct sembuf  buf;
    buf.sem_num=0;//第几个
    buf.sem_op =10;//怎么操作(1.op>0 指释放资源   2.op<0 申请资源  3.op==0等大资源为0)
    buf.sem_flg=0; //IPC_NOWAIT

semop(semId,&buf,1);
}
void w_zero(int semId)
{
    struct sembuf  buf;
    buf.sem_num=0;//第几个
    buf.sem_op =0;//怎么操作(1.op>0 指释放资源   2.op<0 申请资源  3.op==0等大资源为0)
    buf.sem_flg=0; //IPC_NOWAIT

semop(semId,&buf,1);

}

最新文章

  1. vim自动补全功能
  2. 浅尝辄止——使用ActiveX装载WPF控件
  3. 什么是P3O?
  4. HTML图片元素(标记)
  5. 如何快速读懂大型C++程序代码
  6. ssh 配置自动登录
  7. scala集合
  8. source insight新建工程,添加文件时出现“no files found”
  9. Spark生态之Spark Core
  10. Drawable(2)State list Drawable Resource介绍
  11. A Knight&#39;s Journey(dfs)
  12. PID38 串的记数(codevs2077)
  13. Ubuntu12.04 下配置tomcat
  14. 导入虚拟机vmware,此主机支持Intel VT-x,但Intel VT-x处于禁用状态和黑屏
  15. 金融量化分析【day112】:量化平台的使用-第一个策略
  16. mybatis 插入数据 在没有commit时 获取主键id
  17. 解决IDEA授权报错
  18. 最短路径遍历所有的节点 Shortest Path Visiting All Nodes
  19. Jmeter-安装与配置
  20. android 中遇到 imageView getWidth 始终为0 时 ,设置 setImageBitmap 的方法

热门文章

  1. JS-语句五
  2. MySQL读写分离如何实现?
  3. ubuntu 18.04 安装 Redis-server
  4. 【每日Scrum】第六天冲刺
  5. 销售de经典语录
  6. Android studio个人常用快捷键
  7. 系统学习python第六天学习笔记
  8. 打水滴(BFS)
  9. 十、GUI编程
  10. 由AnnotatedElementUtils延伸的一些所思所想