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