”当编辑器终止时,系统向父进程(a.out进程)发送SIGCHLD信号。父进程捕捉它,然后从信号处理程序返回。但是若父进程正在捕捉SIGCHLD信号(因为它创建了子进程,所以应当这样做以便了解它的子进程在何时终止),那么正在执行system函数时,应当阻塞对父进程递送SIGCHLD信号。”
开始我对红色部分的内容非常不理解,特别是不理解括号的部分想要说明的意思。后来在网上找到一段这样的文字才恍然大悟:
由于system函数的实现基本原理是使用fork函数创建一个子进程,用子进程调用exec函数,之后将子进程运行的内容替换成了目标程序。如果不阻塞SIGCHLD信号,那么如果在调用system函数之前还创建了一个其它的子进程,那么当system函数中fork创建的子进程结束后会给父进程发送SIGCHLD信号,如果此时父进程设置的信号处理方式是捕捉而且在信号处理函数中调用了wait函数,那么system函数就无法根据其函数中创建的子进程返回状态获取相应的返回值。记得有这样的规定,system函数的返回应该是函数中创建子进程的返回状态。所以为了能保证system能够正确获取system函数中创建的子进程返回状态,SIGCHLD信号必须被阻塞。
同样,为了保证system函数不出现其它的一些问题,要求system函数要忽略SIGINT和SIGQUIT信号,如果system函数调用的程序是交互式的,如“ed”,就可能出现一些小问题。
其实红色括号想要阐述的就是绿色字体所表达的意思。
阅读(477) | 评论(0) | 转发(0) |