深入理解Unix进程--读后总结
2018-05-30 本文已影响0人
董成鹏
- 进程皆有标识pid,可以通过
getpid()
系统调用来获得进程的pid
- 进程皆有父进程,天字第一号进程除外。每个进程天生就知道他自己的父进程,可以通过
getppid()
系统调用来获得进程的ppid
- 进程皆有文件描述符fd,Unix中一切皆文件,包括普通文件,管道,套接字等资源,文件描述符是资源的id。文件描述符是进程独占的,除了
fork
进程之外,不与其他进程共享
- 每个进程默认有三个文件描述符
stdin,stdout,stderr
。
- 系统能够同时打开的文件描述符有最大的限制,限制分为进程自身的限制(软限制)和内核限制(硬限制)。任何进程都可以修改自身的软限制,但是只有root用户可以修改内核的硬限制。当超出限制的时候,会抛出
Errno:EMFILE
异常。
- 可以通过系统调用
setrlimit()
和getrlimit()
来设置和获取系统的限制
- 进程皆有环境变量,用键值对表示,使用key=value可以给进程设置环境变量。通过
env
命令可以查看该进程设置的环境变量。子进程的环境变量是从父进程继承的。可以通过getenv
,setenv
库函数来获取和设置环境变量
- 进程皆有参数,叫做
ARGV
,这是一个数组,所有进程都可以访问该数组,来获得外部传递给自己的启动参数。
- 进程皆有进程名,并且进程名可以在进程运行的过程中被动态的修改。
- 进程皆有退出码,0-255用于表示进程的退出状态。所谓雁过留痕,这是进程最后为系统提供进程信息的机会了。有多种方法可以退出,
exit(n)
来强行退出,abort string
退出进程,并打印一个字符串到stderr。raise string
产生一个异常然后退出。以上的几种退出方法,都会让进程做一些清理工作,有一个终极退出方法是exit! (n)
来强行退出进程,不调用任何的清理方法
- 进程皆可衍生。也就是
fork
.fork
出来的进程用于父进程的所有资源,包括文件描述符,所以fork出的子进程拥有父进程一样的套接字,这个很重要,一般fork出来进程都要先关闭子进程的套接字。
fork
在父进程中返回子进程的pid,在子进程中返回0
- 如果父进程在子进程之前结束之前先结束了,子进程就变成孤儿进程了。除非该孤儿进程是特意而为之的,比如守护进程,否则的话,孤儿进程就会变成僵尸进程
- 进程皆可待。这是和进程皆可衍生对应的。任何一个进程都可以调用一些方法(比如Process.wait)来使自己等待某个子进程退出之后继续往下执行。
- Process.wait等待父进程的任意一个子进程退出,并且返回该子进程的pid。他还有几个变体Process.wait2,他也是等待任意一个子进程退出,但是会返回两个参数,一个是退出子进程的pid,一个是子进程退出时候的状态码
- Process.wait还有两个变体是Process.waitpid和Process.waitpid2,这两个变体可以接受一个pid号,等待特定的子线程退出。