一、硬链接与软连接
硬链接与源文件指向同一个inode,删除原文件,硬链接不受影响。
软连接相当于一个快捷方式,独立于原文件,删除软连接不影响原文件,原文件删除软连接失效。
二、信号
1、使用signal安装一个信号处理函数,systemV语义在调用信号处理函数前会将信号处理回复为默认,且调用信号处理函数时没有设置掩码阻塞后续信号到来。
编译时gcc 使用了 编译选项 -std=xxx 会使用systemV语义,详见man pages。
2、通过掩码阻塞一个信号,该信号信号产生时会进入信号等待队列,待解除阻塞后递送。非实时信号不支持排队,因为内核用位来记录该信号,信号产生多次,队列里只记录一次。一个信号产生时,先看该信号是否屏蔽,如已屏蔽则进入等待队列,否则调用信号处理函数或执行默认动作。
3、多线程下,信号掩码是线程级的,每个信号可以由单独的掩码,信号的处置和动作时进程级的。注册了信号处理函数时,内核会任选一个线程执行处理函数。
三、线程互斥与同步
1、互斥锁:拿不到锁时阻塞,直到锁可用。避免死锁:以相同的顺序加锁,反序解锁。
2、条件变量:阻塞直到发来通知,有徦醒的问题,用while替代if判断睡眠条件
3、自旋锁:拿不到锁时忙等,直到锁可用。适用于加锁时间不长的场景。多用于内核,应用层较少。
4、读写锁:同时可以拿到多把读锁,写锁只能获取一个,适用读者多,写者少的场景。
5、屏障:设置一道屏障,指定数量的线程都就绪了各线程才继续往下执行。