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

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);

}

IPC之——信号量集的更多相关文章

  1. IPC之——信号量集(多个信号量)

    如果两个进程不仅需要同步,还要保证先后执行顺序,就要用两个信号量(互斥锁)来解决 //栅栏模型:实现以下框架中的四个子进程 所有进程做完任务后 在一起执行下一次  #include <stdio ...

  2. System V IPC 之信号量

    本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...

  3. Linux IPC 之信号量

    信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个执行进程/线程运行,这种工作就需 ...

  4. IPC之信号量

    无名信号量 POSIX标准提出了有名信号量和无名信号量来同步进程和线程,而linux(2.6以前)只实现了无名信号量. sem_overview中有详细介绍:man 7 sem_overview. S ...

  5. IPC进程间通信---信号量

    信号量 信号量:信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对于临界资源访问的同步.临界资源可以 理解为在某一时刻只能由一个进程或线程操作的资源,这里的资源可以是一段代码.一个变量或某种 ...

  6. linux IPC的信号量

    信号量相关函数原型 获得一个信号量ID #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h&g ...

  7. ucos信号量集源码分析

    在实际的应用之中,一个任务经常需要等待多个信号量的同时生效,或者说任务需要根据多个信号量的组合作用的结果来决定任务的运行方式,为了实现这种多信号量组合的功能,ucos实现了信号量集的特殊结构. 信号量 ...

  8. μC/OS-II 信号量集

    简介 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构--信号量集. 信号量集所能 ...

  9. 【iCore4 双核心板_uC/OS-II】例程十:信号量集

    一.实验说明: 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集. 二.实验 ...

随机推荐

  1. c++ 排序 冒泡 插入 选择 快速

    //冒泡 #include <iostream> using namespace std; void bubbleSort(int* list,int index) { ;i--) //i ...

  2. Emoji表情符号兼容方案

    Emoji表情符号兼容方案 一 什么是Emoji    emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. em ...

  3. 题解 P1019 【单词接龙】

    题目 单词具体是什么不重要,知道单词间如何转化即可 [分析] 先理清一下题意: \(n\)个单词,每个单词限用两次 上一个单词能与下一个单词接上,当且仅当上一个单词的末尾 \(k\) 个字符与下一个单 ...

  4. (转)绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程

    以系统的一个“添加商品”的功能为例加以说明,系统页面为add.jsp,如图一所示: 图一  添加商品界面 系统的代码目录结构及add.jsp代码如图二所示: 图二   系统的代码目录结构及add.js ...

  5. sonarqube linux安装总结,集成jenkins

    第一条建议,安装sonarqube首先看好版本号,不同版本号的安装配置可能不同,如果你想走捷径,看官网对应发布的安装使用教程.https://www.sonarqube.org/downloads/ ...

  6. vue中使用elementUI中表格的v宽度,字体大小

    <el-table :row-style="{height:'20px'}" :cell-style="{padding:'0px'}" style=&q ...

  7. urllib简单介绍

    # urllib简介: 1.urllib模块是Python的一个请求模块 2.Python2中是urllib和urllib2相结合实现请求的发送. Python3中统一为urllib库 3.urlli ...

  8. shell 命令综合实战

    此篇为运维人员(开发)经常使用的查看系统状态的相关命令,主要综合了awk,grep ,sed等文本处理命令,能够大大提高工作效率,在此做个简单分享,也便于自己以后查找,毕竟好记性不如烂笔头. 获取et ...

  9. 吴裕雄--天生自然Linux操作系统:Linux 简介

    Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 PO ...

  10. latex学习笔记----基本知识、文档排版

    1.空格和制表符等空白字符视为相同的空白距离,多个连续的空白字符等同为一个字符. 2.#  $  %  ^  _    {   }  ~ 在这些字符前面加上反斜线,就可以在文本中得到它们. 反斜线\不 ...