zoukankan      html  css  js  c++  java
  • linux io 学习笔记(02)---条件变量,管道,信号

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

    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 ",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剩余的时间。

  • 相关阅读:
    2016工作目标
    Android简化xml sax解析
    dynamic-load-apk插件原理整理
    Spring boot 拾遗 —— Spring Cache 扩展 Duration
    Spring boot 拾遗 —— Spring Cache 使用 Jackson 与 自定义 TTL
    Spring boot 拾遗 —— 错误验证
    简化 Java 代码 ——(一)使用 PropertyMapper
    Java 开源项目 OpenFeign —— feign 结合 SpringBoot
    Java 开源项目 OpenFeign —— feign 的基本使用
    Java 定时任务 Quartz (三)—— 并发
  • 原文地址:https://www.cnblogs.com/jiaan/p/9397989.html
Copyright © 2011-2022 走看看