条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒。条件变量类似异步通信,操作的核心:睡眠、唤醒。

1.pthread_cond_t  定义条件变量

2.初始化条件变量

  函数原型:int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);

  功能  :初始化条件变量

  参数:cond   条件变量标识符

      addr  属性

  返回值:成功  :0;失败:错误码

3.休眠

  函数原型:int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

  功能:  任务执行睡眠。执行睡眠之前,必须执行上锁

  参数:  cond  条件变量标识符

        mutex  互斥锁标识符

  返回值:  成功: 0;失败:错误码

4.执行唤醒操作

  函数原型:int pthrerad_cond_signal(pthread_cond_t *cond);

  功能:执行唤醒操作

  参数:cond  条件变量标识符

  返回值: 成功 0;失败:错误码

5.摧毁条件变量

  函数原型:int pthread_cond_destroy(pthread_cond_t *cond);

  功能:  摧毁条件变量

  参数:  cond  条件变量标识符

  返回值:成功:0;失败 :错误码。

注意:在睡眠之前,执行上锁处理,将睡眠操作锁住,在线程执行睡眠的时候,不会被打断。

    pthread_mutex_lock(&lock);

   线程睡眠,函数阻塞,函数  自动  释放锁资源,此时线程得到唤醒信号,pthread_cond_wait立刻返回,有阻塞编程非阻塞,pthread_cond_wait立刻自动执行上锁处理

    pthread_cond_wait(&cond,&lock);

    注意:   唤醒操作发生在睡眠之前,则唤醒操作无效。所以,发送信号一定要咋睡眠之后。

  printf("buf=%s\n",buf);      临界区

  pthread_mutex_unlock(&lock);  解锁处理

无名管道:

  1.要点:

    1)只能用于具有亲缘关系的进程之间的通信

    2)半双工的通信方式,具有固定的读端和写端

    3)管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read/write函数

    4)无名管道的操作属于一次性操作,如果对无名管道执行读操作,数据就会被读走(类似剪切的方式)

    5)无名管道管道的大小是固定的,管道一旦写满,写操作就会阻塞,管道的大小为64K

    6)当管道中无数据,执行读操作,读操作阻塞

    7)无名管道写满,写操作阻塞,如果管道中有大于4k的空间,写操作就可以继续,每次最多写入4k的整数倍

    8)无名管道不保证操作的原子性,如果当前管道,满足读写条件,读写可以并发。

    9)向无名管道中写数据,将读端关闭,管道损坏,进程收到信号(SIGPIPE)将进程退出

    10)当管道中有数据,将写端关闭,读操作可以执行,之后数据读完,可以继续读取(非阻塞)

  2.创建无名管道:

    函数原型:int pipe(int pipefd[2]);

    功能  :创建无名管道

    参数:  pipefd[2]  保存的是操作管道的两个文件描述符

              pipefd[1]管道的写端

              pipefd[0]管道的读端

    返回值:成功 0;失败:-1;

有名管道:

1.要点

  1)有名管道可以使互不相关的两个进程互相通信。

  2)有名管道可以通过路径名来指出,并且在文件系统中可见

        (文件系统:提供文件维护的机制)

  3)进程通过文件IO来操作有名管道

  4)有名管道遵循先进先出规则

  5)不支持如LSEEK()操作

  6)有名管道:先创建,再打开。

2.相关函数  

  1)创建有名管道

    函数原型:int mkfifo(const char *pathname,mode_t mode);

    功能  :创建有名管道

    参数  :pathname  路径名(管道名)

          mode   文件所属用户的执行权限

    返回值:成功:0 ;失败 -1

信号:

  1.要点

    信号是一种异步通信机制,信号可以直接进行用户空间进程和内核进程之间的交互

    内核进程也可以利用它来通知用户空间进程发生了那些系统事件

    用户进程对信号的相应方式:

      1.忽略信号:对信号不做任何处理,但是有两个信号不能忽略:SIGKILL和 SIGSTOP

      2捕捉信号:用户自定义信号处理函数,当信号发生时,执行相应的处理函数。

      3.执行默认操作:Linux对每种信号都规定了默认操作

      可用   kill   -l   查看当前linux可用的信号

  2.相关函数

    1)注册信号

        函数原型:type void (*sighandler_t(int));  == typedef void(*)sighandler_t;

            sighandler_t   signal(int signum,sighandler_t handler);

        功能   :注册信号

        参数  :signum  注册信号的类型

             handler  对注册信号的处理,自定义函数:执行捕捉信号

                              SIG_IGN  忽略信号

                              SIG_DFL  执行信号的默认操作

        返回值:失败:SIG_ERR

    2)想进城或进程组发送任何一个信号

      函数原型:int kill(pid_t pid,int sig);

       功能  :向进程或进程组发送任何一个信号

        参数   :pid  》0  指定进程号进行发送

              = 0 信号发送给与调用进程在同一个进程组下的所有进程

              -1 信号发送给当前进程允许发送的任何一个进程(init进程)

              <-1 信号发送个进程组ID等于-PID下的任何一个进程

            sig  发送信号的类型

    3)给调用进程发送信号

        函数原型:int raise(int sig);

            功能:给调用进程发送信号

            参数:sig  信号的类型

    4)函数时钟设置

      函数原型:unsigned int alarm(unsigned int seconds);

      参数:  sec 秒数(从设置时钟开始,到sec秒之后,进程收到信号SIGALRM,进程退出)

      返回值:  成功  0

    

  在alarm 之后,在次执行alarm,新的时钟将会替换上一次时钟设置,开始以新的时钟开始计时

  会返回上一次执行ALARM到当前执行ALARM剩余的时间。

linux io 学习笔记(02)---条件变量,管道,信号的更多相关文章

  1. linux io 学习笔记(03)---共享内存,信号灯,消息队列

    system V IPC 1)消息队列 2)共享内存 3)信号灯(信号量集) 1.消息队列. ipcs -q 查看系统中使用消息队列的情况 ipcrm -q +msqid 删除消息队列 消息队列工作原 ...

  2. linux io 学习笔记(01)---锁,信号量

    1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源. 2.sudo  dmesg -c 消除dmesg缓冲 3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性 ...

  3. 尚硅谷韩顺平Linux教程学习笔记

    目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...

  4. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

  5. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  6. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  7. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  8. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  9. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...

随机推荐

  1. Java使用FileReader(file)、readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号。

    //Java使用FileReader(file).readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号. public static void readFi ...

  2. 在Hibernate单向一对多关联关系中的org.hibernate.StaleStateException 异常。

    具体异常如下: Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count fro ...

  3. linux下时间同步的两种方法分享(转)

    与一个已知的时间服务器同步 代码如下: ntpdate time.nist.gov 其中 time.nist.gov 是一个时间服务器. 删除本地时间并设置时区为上海 复制代码 代码如下: rm -r ...

  4. 利用Graphviz画出图

    graphviz官网:http://www.graphviz.org/ 背景:有画图需要,之前见到别人用graphviz画,画出来的图漂亮,且自动帮你排版安排布局,所以自己想尝试用它画. 其中遇到的几 ...

  5. Javascript中==和===的区别

     一.JavaScript"=="的作用 1.当==两边的内容是字符串时,则比较字符串的内容是否相等. 2.当==两边的内容是数字时,则比较数字的大小是否相等. 3.当==两边的内 ...

  6. Android学习笔记_31_通过后台代码生成View对象以及动态加载XML布局文件到LinearLayout

    一.布局文件part.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  7. 深入 Struts2 的配置 - 处理多个请求-处理请求结果-模型驱动-异常机制

    转:http://www.java3z.com/cwbwebhome/article/article2/2938.html?id=1631 本部分主要介绍struts.xml的常用配置. 1.1.   ...

  8. js面向对象编程——创建对象

    JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象. 当我们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找 ...

  9. Django-rest-framework(三)view and viewsets使用

    DRF 中有多种view和viewsets,我整理了一下,如下图所示,接下来,我们分别了解下view,viewsets. APIView 所有的view,viewsets都是继承APIView,而AP ...

  10. ios应用数据存储方式(偏好设置)-转

    一.简单介绍 1.很多ios应用都支持偏好设置,比如保存用户名,密码,字体大小等设置,ios提供了一套标准的解决方案来为应用加入偏好设置功能. 2.每个应用都有个NSUserDefaults实例,通过 ...