为保证每个进程有父进程:
一个进程结束时,内核检查所有active进程,看该进程是否某某的父进程。
如果是,把某某父进程变为init进程。
子进程早于父进程结束时,内核为其保留一个最小信息集:进程号,退出状态和占用cpu时间。
zombie process
一个进程结束,但是他的父进程没有wait他。
被init收养的进程,在结束时,init会调用wait收集信息。
进程正常退出还是非正常退出,父进程都异步地收到一个SIGCHLD信号,默认忽略些信号。
最好在收到sigchld信号时,调用wait,
wait 是阻塞的,直到有子进程结束, 等第一个结束的子进程
waitpid 有选项可以不阻塞, 可以指定某个子进程
如果某子进程已zombie了,调用wait将立即返回
waitpid
pid == 1
Waits for any child process. In this respect, waitpid is equivalent to wait.
pid > 0
Waits for the child whose process ID equals pid.
pid == 0
Waits for any child whose process group ID equals that of the calling process. (We discuss process groups in Section 9.4.)
pid < 1
Waits for any child whose process group ID equals the absolute value of pid.
wait3,wait4
多了一个struct rusage指针参数,允许内核返回该进程及其子进程使用的所有资源之和。
资源信息包括:用户cpu,系统cpu,页错误数,收到信号数等。
man setbuf
当output stream是unbuffered,信息会立即出现在目标文件中,
如果是block buffered,许多字符会保存,直到作为块写到文件,
如果是line buffered,遇到newline就会输出,
通常,file是block buffered,stdout是line buffered,而stderr是unbuffered
exec系列函数
l 代表list char *arg0, char *arg1, ..., char *argn, (char *)0(NULL POINTER)
v 代表vector
execle和execve
exec关系
只有execve是系统调用,其它都是调用execve的,
execl --> execv
execvp --> execv --> execve
外面变量和环境变量可能这样用
在main方法里,extern char **environ
就可以使用环境变量了,效果与main的第三个参数相同。
5到10节
阅读(501) | 评论(0) | 转发(0) |