Linux进程概述
1、基本概念
程序:存放在磁盘文件中的可执行文件。
进程:程序执行的实例。(process)
进程ID:每个Linux进程都一定有一个唯一的非负整数数字标识符,称为进程ID。
2、Linux进程分析
Linux系统是一个多进程的系统,进程间具有并行、互不干扰的特性。
Linux进程可以分为三段:代码段、数据段和堆栈段。
代码段:存放程序代码
数据段:存放静态变量、全局变量、常数以及动态数据分配空间(malloc函数取得的空间)
堆栈段:存放子程序返回地址、子程序的参数以及程序的局部变量。
在一个程序运行时,哪些变量存放在堆中,哪些变量存放在栈中?
例:init进程 进程ID:1
init进程绝对不会终止,它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),但是它以超级用户特权运行。
获取进程标识:
- #include<sys/types.h>
- #inclued<unistd.h>
- pid_t getpid(void); 返回:调用进程的进程ID
- pid_t getppid(void); 返回:调用进程的父进程ID
- uid_t getuid(void); 返回:调用进程的实际用户ID
- uid_t geteuid(void); 返回:调用进程的有效用户ID
- gid_t getgid(void); 返回:调用进程的实际组ID
- gid_t getegid(void); 返回:调用进程的有效组ID
表示由当前进程再生成一个进程出来。
- #include<sys/types.h>
- #include<unistd.h>
- pid_t fork(void);
- 返回:两个值,大于零的为子进程的ID号,等于零则表示处于子进程中。
由fork创建的新进程为子进程
子进程继承了父进程的所有地址空间:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
父、子进程间的区别:
①fork函数的返回值;
②不同的进程ID;
③子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime设置为0;
④父进程设置为锁,子进程不继承;
⑤父进程中的未决告警,子进程不继承;
⑥子进程的未决信号集设置为空集。
4、vfork函数
嵌入式系统硬件空间有限。故现在很多实现并不做父进程数据段和堆的完全拷贝,而是使用写进复制(cope_on_write,COW)技术。区域由父、子进程共享,而且内核它们存取许可权改为只读。若有进程试图修改这些区域,则内核为相关部分做拷贝。