UNIX进程环境及关系

来源:互联网 发布:你不知道的js pdf 编辑:程序博客网 时间:2024/06/04 21:15

进程环境 

7.2main函数:
C总是从 main函数开始执行  其原型是

Int main(int  argc , char *argv[]);

其中argc是命令行参数 的数目 ,argv是指 向参数的各个指针所构成的数组。

当内核执行C程序时,(使用一个exec函数) 在调用main前 先调用一个特殊的启动例程。可执行程序文件将此启动例程,指定为程序的起始地址---这是由链接编辑器设置的,而链接编辑器则由C编译器调用。启动例程从内核取得命令行参数和环境变量值。然后为按上述方式调用main函数做好安排。

 

7.3进程终止

5种正常终止:

1.从main 返回

2.调用exit

3.调用_exit或_Exit

4.最后一个线程从启动例程返回。

5.最后一个线程调用pthread_exit

 

7.6C程序的存储空间布局

·正文段:这是由cpu执行的机器指令部分,通常正文段是可共享的

·初始化数据段:通常称为数据段:包含了程序中需明确地赋初值的变量。

·为初始化数据段:bss段 :程序开始执行前,内核将此段中的数据初始化为0或空指针。

·栈:自动变量以及每次函数调用所需保存的信息都存在此段中

·堆:通常在堆中进行动态存储分配。

对于32位x86处理器上的linux正文段从0x08048000单元开始,栈底则在0xc0000000之下开始(高地址向低地址增长)



进程控制

本章介绍了UNIX系统的进程控制 : 创建新进程,执行程序和进程终止,还说明了进程属性的各种ID。


8.2进程标识:
每个进程都有一个非负整形标识唯一进程ID。常用其作为其他标识符的一部分以保证其唯一性。例如:应用程序有时就把进程ID作为名字的一部分来创建一个唯一的文件 。


一些专用进程 :ID为0的进程通常是调度进程。ID为1的通常是init进程,此进程负责在自举内核后启动一个UNIX系统,init通常读取与系统有关的初始化文件。Init进程绝不会终止。


8.3fork:
由fork创建的新进程被称为子进程:被调用一次返回两次:子进程:0父进程:子进程ID;
一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID。


Fork之后,子进程是父进程的副本,例如:子进程获得父进程的数据空间,堆和栈的副本。这是子进程所拥有的副本,父子进程并不共享这些存储空间部分。 父进程和子进程共享正文段。


8.4vfork
Vfork函数用于创建一个新进程,而该新进程的目的是exec一个新程序。它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec。
Vfork和fork的一个区别是:vfork保证子进程(这段时间内核会使父进程休眠) ,它在调用exec或exit之后父进程才可能被调度运行。


8.5exit


 8.6wait和waitpid
一个进程正常或异常终止时,内向就向其父进程发送SIGCHILD信号。因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知。
调用wait和waitpid会发生什么:
1. 如果所有子进程都还在运行,则阻塞。
2. 若一个子进程已经终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
3. 如果没有任何子进程,则立即出错返回。


两个函数的具体区别:


8.9竞争条件:
当多个进程都企图对共享数据进行某种处理,而最后结果又取决于进程运行顺序时 我们认为发生了竞争条件。


8.10exec
当进程调用一种 exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为exec并不创建新进程,所以前后的进程ID并未改变,exec只是用磁盘上的一个新程序替换了当前进程的正文段,数据段,堆栈段。


8.11更改用户ID和组ID。

0 0