1、时序竞态(竞态条件)
pause()函数:调用该函数可以导致进程挂起,等待信号唤醒
解决时序问题:sigsuspend(const sigset_t* mask)挂起等待信号
信号不可靠性
2、全局变量异步I/O:加锁
3、可/不可重入函数
定义可重入函数:函数内部不能含有全局变量和static变量,不能使用malloc,free
信号捕捉函数应该设计为可重入函数
信号处理程序可以调用的可重入函数参考 man 7 signal
没有包含上述函数的大多属于不可重入函数,究其原因:
使用全局变量、调用了malloc/free、是标准的I/O函数
4、SIGCHLD信号
产生条件:子进程终止,子进程接收到SIGSTOP信号停止时,子进程处在停止态,接受到SIGCONT后唤醒
5、信号传参
sigqueue
6、中断系统调用
系统调用分类:
1)慢速系统调用
2)其他系统调用
7、终端
ttyname()由文件描述符求文件名
8、进程组
getpgrp
getpgid
setpgid
8、会话
1、调用进程不能是进程组长,该进程变成新会话进程(seesion header)
2、该进程成为一个新进程组的组长进程
3、需用root权限
4、新会话会丢弃原有的控制终端,该会话没有控制终端
5、该调用进程是组长进程,则出错返回
6、建立新会话时,先调用fork、父进程终止,子进程调用setsid
getsid
9、守护进程
在后台服务进程、独立于控制终端并周期性的执行某种任务或等待处理某些发生的事件
创建守护进程:最主要:调用setsid()
第一步:创建子进程fork()
第二步:子进程创建新会话 setsid()
第三步:改变进程工作目录位置:chdir()
第四步:指定文件掩码 umask()
第五步:将文件描述符0/1/2关闭或者重定向
第六步:守护进程主逻辑
第七步:退出