当一个进程正常或一场终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步时间,所以这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时既被调用执行的函数。对于这种信号的系统默认是忽略它。
wait
如果其所有子进程都还在运行,则阻塞。
如果一个子进程已终止,则立即出错返回。
如果他没有子进程,则立即出错返回。
waitpid
pid == -1 等待任一子进程。此种情况下,waitpid与wait等效。
pid > 0 等待进程ID与pid相等的子进程
pid ==0 等待组ID等于进程组ID的任一子进程
pid < -1等待组ID等于pid绝对值的任一子进程。
waitpid函数反悔终止子进程的进程ID,并将该子进程的终止状态放在由statloc指向的存储单元中。
对于wait,其唯一的出错是调用进程没有子进程。但是对于wiatpid,如果指定的进程或进程组不存在,或者参数pid之地鞥的进程不是调用进程的子进程,都可能出错。
waitpid通过WUNTRACKCED和WCONTINUED选项支持作业控制。
waitid
P_PID 等待一特定进程。id包含要等待子进程的进程ID
P_PGID 等待一特定进程组的任一子进程,id包含要等待子进程的进程组id
P_ALL 等待任一子进程。忽略id
exec
当进程调用一总exec函数时,该进程执行的程序完全替换位新程序,而心程序则从其main函数开始执行。因为exec并不创建心进程,所以前后的进程ID并未改变。exec只是用磁盘上的一个心程序替换当前进程的正文段、数据段、堆段和栈段。
一般而言,在设计应用时,我们总是试图使用最小特权模型。
1 若进程具有超级用户特权,则setuid函数将实际用户id、有效用户id以及保存的设置用户id设置为uid。
2 若进程没有超级用户特权,但是uid等于实际用户id或者保存的设置用户id,则setuid只将有效用户id设置位uid。不更改实际用户id何保存的设置用户id。
3 如果上面两个条件都不满足,则errno设置位EPERM,并返回-1。
在此嘉定_POSIX_SAVED_IDS为真。如果没有提供这种功能,则上面所说的关于保存的设置用户id部分都无效。
仅当对程序文件设置了设置用户id位时,exec函数才设置又小用户id。如果设置用户id位没有设置,exec函数不会改变有效用户id,而将维持其现有值。任何时候都可以调用setuid,将有效用户id设置为实际用户id或保存的设置用户id。自然地,不能将有效用户id设置位任一随机值。
保存的设置用户id是由exec复制有效用户id而得到的。如果设置了文件的设置用户id位,则在exec根据文件的用户id设置了进程的又小用户id以后,这个副本就被保存起来了。
进程会计 process accounting
大多数unix系统提供了一个选项进行进程会计处理。启用该选项后,当进程借宿时内核就写一个会计记录。
在会计文件中记录的顺序对应于进程终止的顺序,而不是他们的启动顺序。
为了确定启动顺序,需要读全部会计文件,并按启动日历时间进行排序。
会计记录对应于进程而不是程序。
UNIX系统历史上对进程提供的知识基于调度优先级的粗粒度的控制。调度策略和调度优先级是由内核确定的。进程可以通过调整nice值选择以更低优先级运行。只有特权进程允许提高调度权限。nice值越小,优先级越高。
网友评论