管道学习笔记

复习:线程的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 结构体

原文地址:https://www.cnblogs.com/zhou2011/p/2313515.html