Linux环境编程课件Linux环境编程7章节

上传人:E**** 文档编号:91235946 上传时间:2019-06-26 格式:PPT 页数:52 大小:447KB
返回 下载 相关 举报
Linux环境编程课件Linux环境编程7章节_第1页
第1页 / 共52页
Linux环境编程课件Linux环境编程7章节_第2页
第2页 / 共52页
Linux环境编程课件Linux环境编程7章节_第3页
第3页 / 共52页
Linux环境编程课件Linux环境编程7章节_第4页
第4页 / 共52页
Linux环境编程课件Linux环境编程7章节_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《Linux环境编程课件Linux环境编程7章节》由会员分享,可在线阅读,更多相关《Linux环境编程课件Linux环境编程7章节(52页珍藏版)》请在金锄头文库上搜索。

1、1,第7章,进程和信号,2,7.1 进程的基本概念,什么是进程 操作系统中最基本、重要的概念。 多种定义: “一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。” “正在运行的程序。” 所有采用多道程序设计的操作系统都建立在进程的基础上。 从理论角度看,进程是对正在运行的程序过程的抽象。 从实现角度看,进程是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。 进程和程序的关系: 程序是指令的有序集合,静态的概念。 进程是一个具有独立功能的程序关于某个数据集合在处理机上的一次执行过程,动态的概念。 进程可以申请和拥有系统资源,是一

2、个活动的实体,包括: 当前的活动(通过程序计数器的值和寄存器的内容来表示) 程序代码、数据、变量(占用着系统内存) 打开的文件(文件描述符) 环境。,3,7.1 进程的基本概念,什么是进程 进程的特征: 动态性:进程的实质是程序的一次执行过程,进程是动态产生、动态消亡的。 并发性:任何进程都可以同其他进程一起并发执行。 独立性:进程能够独立运行,是系统分配和调度资源的基本单位。 异步性:因进程的独立性,各进程按各自独立的、不可预知的速度向前推进。 结构性:从结构上看,进程大体上由程序段、数据段和进程控制块三部分组成。,4,程序的入口 int main(int argc, char *argv)

3、; 当内核起动C程序时,首先调用一个特殊的起动例程(编译连接程序将该例程设置为可执行程序的起始地址)。 起动例程从内核取得命令行参数和环境变量值,然后调用main函数,并将命令行参数传递给它。,Program 7-1 ex_main.c 1 #include 2 3 int main(int argc, char *argv) 4 5 int i; 6 for(i = 0; i argc; i+) 7 printf(“argv%d: %sn“, i, argvi); 8 return 0; 9 ,for(i=0; argvi != NULL; i+),7.1.2 Linux进程环境,5,进程的

4、终止 5种方式 正常终止 从main返回 调用exit 调用_exit或_Exit 异常终止 被一个系统信号终止 调用abort,它产生SIGABRT信号 起动例程会在main函数return后立即调用exit函数。 exit(main(argc, argv);,7.1.2 Linux进程环境,6,退出函数 _exit和_Exit, 正常终止一个程序,立即进入内核. exit, 正常终止一个程序,先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I/O流等),然后进入内核。,#include void exit(int status); void _Exit(int status);

5、 #include void _exit(int status);,exit和_Exit是ISO C标准, 而_exit为POSIX.1标准。 参数status为退出状态。大多数shell都提供检查一个进程终止状态的方法。 如果(a)调用这些函数时不带终止状态,或(b)main执行了一个无返回值的return语句,或(c)main执行隐式返回,则该进程的终止状态是未定义的。,exit(0) 等价于 return(0),7.1.2 Linux进程环境,7,atexit函数 ANSI C规定,一个进程可以登记多至32个由exit自动调用的函数,这些函数被称为终止处理程序(exit handler)

6、,使用atexit函数登记。,#include int atexit(void (*function)(void);,参数 一个函数地址. 返回值 成功返回0,失败返回非0值. exit函数以登记这些函数的相反顺序调用它们。同一函数如若登记多次,则也将被调用多次。,7.1.2 Linux进程环境,8,atexit函数 C程序的起动/终止的方式和过程,内核使程序执行的唯一方法是调用一个exec函数。进程正常终止的唯一方法是显式或隐式地(调用exit)调用_exit。 示例,7.1.2 Linux进程环境,9,atexit函数 示例,7.1.2 Linux进程环境,程序清单 7-2 ex_atex

7、it.c 1 #include 2 3 static void my_exit1(void); 4 static void my_exit2(void); 5 6 int main(void) 7 8 if(atexit(my_exit2) != 0) 9 10 printf(“register my_exit2 failedn“); 11 return -1; 12 13 14 if(atexit(my_exit1) != 0) 15 16 printf(“register my_exit1 failedn“); 17 return -1; 18 19 20 printf(“main is

8、donen“); 21 return 0; 22 ,23 24 static void my_exit1(void) 25 26 printf(“first exit handlern“); 27 28 29 static void my_exit2(void) 30 31 printf(“second exit handlern“); 32 ,jianglinmeiubuntu:/c$ gcc -o ex_atexit ex_atexit.c jianglinmeiubuntu:/c$ ./ex_atexit main is done first exit handler second ex

9、it handler,10,环境表 每个进程在启动时都接收到一张环境表: 一个字符指针数组。全局变量environ记录了该指针数组的地址。,全局变量environ称为环境指针,其所指向的数组称为环境表,数组中的每个指针指向的字符串称为环境字符串。 环境字符串具有约定的形如“name=value”的格式。,7.1.2 Linux进程环境,extern char *environ;,11,C程序的存储空间布局 存储空间的组成部分 正文段 由CPU执行的机器指令构成,共享+只读。 初始化数据段 数据段,由程序中已赋初值的静态变量构成。 非初始化数据段 bss段,在程序开始执行之前,内核将此段初始化

10、为0。 栈 自动变量、参数、函数调用的场景信息(如返回 地址、寄存器值)。 堆 进行动态存储分配,位于非初始化数据段顶和栈 底之间。,7.1.2 Linux进程环境,12,C程序的存储空间布局,使用size命令可查看一个可执行程序的正文段、数据段和bss段的长度,jianglinmeiubuntu:/c$ size /bin/bash text data bss dec hex filename 799889 18452 20232 838573 ccbad /bin/bash,7.1.2 Linux进程环境,13,静态库和共享库 库,就是可复用的二进制可执行代码的有序集合。 静态库和共享库的

11、区别 使用静态库的程序,在编译连接过程即载入静态库的代码并将静态库的代码置入编译出的可执行程序。文件名格式: libxxxx.a。 使用共享库的程序,在编译连接过程仅对共享库作简单引用,在程序运行时才将共享库的代码载入内存。 文件名格式: libxxxx.so.major.minor。 静态库 使用ar命令将多个二进制目标代码文件打包成静态库。使用Linux下的nm命令可列出库中的符号清单。 示例,7.1.2 Linux进程环境,14,静态库和共享库,jianglinmeiubuntu:/c$ gcc -c -o ex_static1.o ex_static1.c jianglinmeiubu

12、ntu:/c$ gcc -c -o ex_static2.o ex_static2.c jianglinmeiubuntu:/c$ ar rcs libmystatic.a ex_static1.o ex_static2.o jianglinmeiubuntu:/c$ nm libmystatic.a ex_static1.o: 00000000 T sum ex_static2.o: 00000000 T average,7.1.2 Linux进程环境,15,Program 7-6 ex_test_static.c 1 #include 2 #include “ex_static.h“ 3

13、4 int main(void) 5 6 printf(“3 + 5 = %dn“, sum(3, 5); 7 printf(“average of 3 and 5 is: %dn“, average(3, 5); 8 return 0; 9 ,jianglinmeiubuntu:/c$ gcc -o ex_test_static ex_test_static.c -L. -lmystatic jianglinmeiubuntu:/c$ ./ex_test_static 3 + 5 = 8 average of 3 and 5 is: 4,7.1.2 Linux进程环境,静态库和共享库,16,

14、静态库和共享库 共享库 不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的副本. 程序第一次执行或者第一次调用某个库函数时,用动态连接方法将程序与共享库函数相连接。因此,减少了每个可执行文件的长度,但增加了一些运行时间开销。 可以用库函数的新版本代替老版本而无需对使用该库的程序重新进行编译和连接。 使用Linux命令ldd可以查看一个二进制可执行程序或共享库所依赖的共享库。,jianglinmeiubuntu:/c$ ldd ex_test_static linux-gate.so.1 = (0x006c4000) libc.so.6 = /lib/i386-linux-gnu

15、/libc.so.6 (0x0026d000) /lib/ld-linux.so.2 (0x00fa8000),7.1.2 Linux进程环境,17,进程控制块和进程表 Linux内核通过进程控制块(PCB)对进程进行控制和管理。PCB由一个task_struct结构体定义. PCB通常是系统内存占用区中的一个连续存储区,它存放着内核用于描述进程情况及控制进程运行所需的全部信息,如: 进程标识符, PID 进程当前状态 进程的程序和数据地址 进程资源清单 进程优先级 CPU现场保护区 用于实现进程间通信所需的信息 其他信息:如父进程的PID、有效用户ID、有效组ID、进程占用CPU的时间、进程

16、退出码、当前目录节点、执行文件节点等 Linux内核将所有进程控制块组织成指针数组形式,形如:,7.2 进程的结构,struct task_struct *taskNR_TASK;,该指针数组即进程表,其中记录了指向各PCB的指针。NR_TASK规定了最多可同时运行进程的个数。内核以PID作为进程表项的索引。,18,PID 每个进程都有一个唯一非负整数作为进程标识。因其唯一性,常用于构成其他的标识符以保证该标识符的唯一性。 三个特殊进程 PID为0调度进程。内核的一部分,也被称为交换进程或系统进程,无对应的程序文件。 PID为1的init进程。在系统自举过程结束时由内核调用(第一个用户进程),其对应的程序文件是/sbin/init。 负责在内核自举后启动一个Linux系统; 通常读与系统有关的初始化文件(/etc

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号