Android C++ 系列:Linux 进程 (一)
1. 进程概念
我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信 息,Linux 内核的进程控制块是 task_struct 结构体。现在我们全面了解一下其中都有哪 些信息。
进程 id。系统中每个进程有唯一的 id,在 C 语言中用 pid_t 类型表示,其实就是一个非 负整数。
进程的状态,有运行、挂起、停止、僵尸等状态。
进程切换时需要保存和恢复的一些 CPU 寄存器。
描述虚拟地址空间的信息。
描述控制终端的信息。
当前工作目录(Current Working Directory)。
umask 掩码。
文件描述符表,包含很多指向 file 结构体的指针。
和信号相关的信息。
用户 id 和组 id。
控制终端、Session 和进程组。
进程可以使用的资源上限(Resource Limit)。
目前大家并不需要理解这些信息的细节,在随后的文章中我们会知道它是保 存在 PCB 中的。
fork 和 exec 是本章要介绍的两个重要的系统调用。fork 的作用是根据一个现有的进程复 制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process)。系统中同时运行着很多进程,这些进程都是从最初只有一个进程开始一个一个 复制出来的。在 Shell 下输入命令可以运行一个程序,是因为 Shell 进程在读取用户输入的命 令之后会调用 fork 复制出一个新的 Shell 进程,然后新的 Shell 进程调用 exec 执行新的程序。
我们知道一个程序可以多次加载到内存,成为同时运行的多个进程,例如可以同时开多 个终端窗口运行/bin/bash,另一方面,一个进程在调用 exec 前后也可以分别执行两个不同 的程序,例如在 Shell 提示符下输入命令 ls,首先 fork 创建子进程,这时子进程仍在执行/ bin/bash 程序,然后子进程调用 exec 执行新的程序/bin/ls 。
2. 进程环境
libc 中定义的全局变量 environ 指向环境变量表,environ 没有包含在任何头文件中,所 以在使用时要用 extern 声明。例如:
由于父进程在调用 fork 创建子进程时会把自己的环境变量表也复制给子进程,所以 a.out 打印的环境变量和 Shell 进程的环境变量是相同的。
按照惯例,环境变量字符串都是 name=value 这样的形式,大多数 name 由大写字母加下划 线组成,一般把 name 的部分叫做环境变量,value 的部分则是环境变量的值。环境变量定义 了进程的运行环境,一些比较重要的环境变量的含义如下:
PATH:可执行文件的搜索路径。ls 命令也是一个程序,执行它不需要提供完整的路径名/bin/ ls,然而通常我们执行当前目录下的程序 a.out 却需要提供完整的路径名./a.out,这 是因为 PATH 环境变量的值里面包含了 ls 命令所在的目录/bin,却不包含 a.out 所在的目 录。PATH 环境变量的值可以包含多个目录,用:号隔开。在 Shell 中用 echo 命令可以查 看这个环境变量的值:
$ echo $PATH
SHELL:当前 Shell,它的值通常是/bin/bash。
TERM:当前终端类型,在图形界面终端下它的值通常是 xterm,终端类型决定了一些程序的输 出显示方式,比如图形界面终端可以显示汉字,而字符终端一般不行。
LANG:语言和 locale,决定了字符编码以及时间、货币等信息的显示格式。
HOME:当前用户主目录的路径,很多程序需要在主目录下保存配置文件,使得每个用户在运 行该程序时都有自己的一套配置。
用 environ 指针可以查看所有环境变量字符串,但是不够方便,如果给出 name 要在环境变量 表中查找它对应的 value,可以用 getenv 函数。
修改环境变量可以用以下函数:
setenv 将环境变量 name 的值设置为 value。如果已存在环境变量 name,那么 若 rewrite 非 0,则覆盖原来的定义; 若 rewrite 为 0,则不覆盖原来的定义,也不返回错误。 unsetenv 删除 name 的定义。即使 name 没有定义也不返回错误。
例修改环境变量
3.进程状态
修改进程资源限制,软限制可改,最大值不能超过硬限制,硬限制只有 root 用户可以修改
查看进程资源限制:
4. 小结
本文介绍了进程的基本概念,进程控制块信息,fork 和 exec 两个主要的系统调用。以及进程环境的修改及获取,进程状态的修改与获取。
版权声明: 本文为 InfoQ 作者【轻口味】的原创文章。
原文链接:【http://xie.infoq.cn/article/f1a22d7982fb1008380c63af5】。文章转载请联系作者。
评论