zoukankan      html  css  js  c++  java
  • 管道学习笔记

    复习:线程的3大重点部分

    线程创建:pthread_create

    线程退出:pthread_exit

    线程回收:pthread_detach

    线程取消:pthread_cancel

    优点:资源共享

    互斥量:(mutex

    pthread_mutex_init

    pthread_mutex_lock

    pthread_mutex_unlock

    pthread_mutex_destory   

    信号量:sem

    sem_init

    sem_wait

    sem_post

    sem_trywait   获得资源继续往下执行

     

    无名管道:pipe

    64KB

    有名管道:fifo  7种设备文件中的P即为fifo服务

    可以通过一个特殊文件p去           open  read  write

    提前创建好这个管道--------------嵌入式linux中

    有名管道遵循先进先出的规则

    创建一个fifo文件------①mkfifo  file.fifo

    int mkfifo(filename, mode) mode-----0666  成功返回0 失败返回-1

     

    阻塞方式打开:

    1.当以只写当方式打开fifo,但读端不存在,则阻塞在open。。。。。。直到有读端存在

    2.当以只读当方式打开fifo,但写端不存在,则阻塞在open。。。。。。直到有写端存在

    这是为了确保fifo的读写都有意义。。。。

    3.当写入数据小于BUFSIZE(64k),尝试写入,如果能全部写入则全部写入,如不能则等待,知道能够全部写入

    4.当写入数据大于BUFSIZE*(64k),写入部分,并不断尝试写入,直到全部写入

    5.当读出数据小于管道现有数据,则读出所需数据

    6.当读出数据大于管道现有数据,则读出全部数据

    7.管道为空,阻塞到有数据可读

    8.当读端关闭,写端收到,SIGPIPE。。。

    9.当写端关闭,读端读出所有数据直到管道为空,读返回0。。。

    管道的大小也是64KB,fifo的内容存在内存中。。。。关闭则清空

    非阻塞方式打开:open(“”, O_RDONLY |O_NONBLOCK)或者加O_NODELAY

    1.不管有无读写段,读端可以打开成功,没有读端时,写端无法打开。。。。。

    2.读fifo,当fifo有数据,读端读出数据,当fifo没有数据,读操作返回0.。。。。。(轮循获取数据)

    3.当fifo没有数据的2种情况:①写端存在返回-1 ②写端不存在返回0

    4.写fifo:当fifo有足够空间,全部写入,返回写入个数

         当fifo没有足够的空间,写入可写入数据,返回写入数据大小

         当fifo没有空间,返回 -1

    5.当读写端同时存在时,关闭写端,读端读操作,返回0

                        关闭读端,写端收到SIGPIPE

    练习:文件拷贝

    A进程--------------------------------B进程

    创建一个mkfifo---------------------创建fifo

    阻塞方式打开fifo-----------------打开fido

    open-----源文件--------------------打开目标文件

    读文件-------------------------------读fifo写文件

    写fifo

    信号:(signal) 模拟中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。。。。

    实时信号-------------------------

    1.信号的处理方式

    2.忽略信号

    3.捕捉信号,并采用指定方式去操作它 ---------- 修改信号的树立方式

    4.执行缺省操作

    信号的使用场合:

    1.所有的进程都可以使用信号

    系统的信号(记住它们的处理方式)

    1.SIGHUP  关闭中断时,当前终端所有进程发送停止信号

    2.SIGINT   CTRL + c 前台进程组每个进程都发送此信号

    3.SIGOUIT  CTRL + \

    5.SIGILL 非法指令,无法解析,无法继续执行。。。。。

    6.SIGFPE 浮点运算错误时发出-----除数为0或者溢出

    7.SIFGKILL  用来立即结束程序的执行,且不能被阻塞、处理和忽略。

    8.SIGALRM 当一个定时器到时的时候发出

    9.SIGSTOP 用来暂停一个进程,且不能被阻塞处理、、、和忽略。。 暂停进程。。。。。

    10.SIGALRM 当一个定时器到时的时候发出

    11.SIGCHLD 子进程退出时,给父进程发送的信号,提醒它回收我的状态  忽略信号····

    12.SIGusr1 不需要考虑对系统的影响。。。。

    信号的发送和捕捉:

    kill 向某一个特定的进程发送一个特定的信号。。。。。(给别人发)

    raise 向自己发送一个信号 。。。。。。 (给自己发)

    参数:

    kill (pid  ,int  sig) sig即系统中的宏,例如 SIGKILL、SIGINT

    pid 整数。。。要发送信号的进程号。。。。

    pid = 0 当前所在进程组

    pid = -1

    alarm()

    闹钟函数,发送SIGALRM  返回值:unsigned int 如果alarm 无法获得毫秒级的时间。。。。。

    pause() 将当前进程挂起。。。。外部传入任意一个信号,将其唤醒

    setitimer(计时策略, 新的定时参数, 老的定时参数)  获取毫秒或者微妙级的时间时使用。。。

    计时策略使用--------系统时间,进程时间

    新的定时参数 ------ set

    老的定时参数 ------ get  不关心其值,则设置为NULL

    signal

    typedef  void (*sighandler_t )(int)

    sighandler_t  signal(int signum, sighandler_t  handler)

    信号的处理:

    sigaction (信号的编号,新的action, 老的action)

    “读----改---写”

    sigaction (SIGALRM, NULL,oldaction)----get

    sigaction (SIGALRM, newaction,NULL)----set

    struct sigaction 结构体

  • 相关阅读:
    [git 学习篇] git commit原理 --实践体会
    [git 学习篇]工作区和暂存区
    [git 学习篇] git文件版本回退再学习
    [git 学习篇]版本回退
    [git 学习篇] 修改文件
    [git 学习篇] 提交文件
    [git 学习篇] --创建git创库
    [测试框架学习] 测试框架的结构包含
    [python测试框架] http接口测试框架
    向SharePoint页面添加后台代码
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2313515.html
Copyright © 2011-2022 走看看