进程和信号
- 进程和信号构成Linux操作环境的基础部分。它们控制着计算机系统执行的几乎所有活动。不管对于系统程序员、应用程序还是系统管理者,理解进程管理都是很有好处。
-
什么是进程
- UNIX标准: 一个其中运行着一个或多个线程的地址空间和这些县城所需要的系统资源。
- 正在运行的进程由程序代码、数据、变量(占用着系统内存)、打开的文件(文件描述符)和环境组成 。
-
进程的结构
- 进程表
- 每一个进程都会被分配一个唯一的数字编号,称之为进程标识符或PID。取值范围2--32768的正整数。1的进程号为init进程预留,init进程负责管理其它进程。
- 进程表就像一个数据结构,把当前加载在内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、命令字符和其他一些ps命令输出的各类信息。
- 查看进程
- 命令 ps -ef
- 命令 ps -ax
- stat代码
- S 睡眠。
- R 运行。
- D 不可中断的睡眠(等待)。
- T 停止。
- Z 死(defunct)进程或僵尸(zombie)进程。
- N 低优先级进程。
- W 分页。
- s 进程是会话期首选进程。
- + 进程属于前台进程组。
- l 进程是多线程的。
- < 高优先级任务。
- 系统进程
- init进程
- 进程调度
- ps命令输出结果中有一条对应ps命令本身记录。
- 每一个进程都是另一个我们称之为父进程的进程启动的,被父进程启动进程我们称之为子进程。
- 在一台单个处理器上同一时间只能有一个进程可以运行,其它进程处于等待运行状态。每个进程轮到的运行时间称之为时间片。
- Linux内核用进程调度器来决定下一个时间应该分配给那个进程。 他的判断依据是进程的优先级。
- 进程nice值决定它的优先级。 可以通过renice命令调整它的值。
- 进程表
-
启动进新程
- system函数:从程序内部启动另一个程序,从而创建一个新的进程,可以用system函数来完成。
- 作用是运行以字符串参数的形式传递给它的命令并等待命令完成。
- 无法启动shell来运行命令返回错误代码127,其他错误是-1, 否则返回命令的退出码。
- 替换进程映像
- exec系列函数由一组相关的函数组成。 exec函数可以把当前进程替换为一个新进程,新进程由path或file参数指定。
- exec函数比system函数更有效,因为新的程序启动后,原来车给你需就不再运行。
- 分两大类
- execl、execlp和execle的参数格式是可变的,参数以一个空指针结束。
- execv和execvp的第二个参数是一个字符串数组。
- 全局变量environ可用来把一个值传递到新的程序环境中。
- 示例:
- execlp函数:
- 复制进程印象
- 通过调用fork创建一个新进程。
- 父进程fork调用返回是新的子进程的PID。 子进程fork返回的是0 。fork失败都是返回-1 。
- 等待一个进程
- wait系统调用将暂停父进程直到他的子线程结束为止。
- 僵尸进程: 子进程终止时,与父进程的关联还会保持,直到父进程也正常终止或父进程调用wait才告结束。虽然子进程不再运行,但它依然存在于系统中,因为它的推出码还需要保存起来,以备父进程今后的wait调用使用。这时它将成为一个死进程或者僵尸进程。
- 父进程异常退出啦,子进程自动把PID为1进程作为自已的父进程。
- 输入和输出重定向
- 已打开的文件描述符将在fork和exec调用之后保留下来,我们可以利用对进程这方面知识的理解来改变程序的行为。
- system函数:从程序内部启动另一个程序,从而创建一个新的进程,可以用system函数来完成。
-
信号
- 信号是系统响应某些条件而产生的一个事件。
- 信号在头文件signal.h 中定义。
- 发送信号
- 进程可以通过kill函数向包括本身的内在其他进程发送一个信号。
- 信号集
- sigaction标志
- 常用信号参考
信号宏名 信号编号 说明 系统默认处理方式
SIGABRT 6 终止进程,调用abort函数时产生 终止,产生core文件
SIGALRM 14 超时,调用alarm函数时产生 终止
SIGBUS 7 硬件故障 终止,产生core文件
SIGCHLD 17 子进程状态改变 忽略
SIGINT 2 终止进程(Ctrl+C) 终止
SIGIO 29 异步通知信号 终止
SIGKILL 9 无条件终止一个进程,不可以被捕获或忽略 终止
SIGPIPE 13 写没有读权限的管道文件时 终止
SIGPOLL 8 轮训事件,涉及POLL机制 终止
SIGTERM 15 kill PID时默认发送的信号 终止
SIGQUIT 3 终止进程( Ctrl+\ ) 终止,产生core文件
SIGSEGV 11 无效存储访问(指针错误) 终止
SIGUSER1 10 用户自定义信号1 终止
SIGUSER2 10 用户自定义信号2 终止