




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第六章第六章 Linux环境编程环境编程2主要内容主要内容o系统调用和库函数简介系统调用和库函数简介o文件操作文件操作o进程管理和同步进程管理和同步o进程通信进程通信o内存管理内存管理36.1 系统调用和库函数系统调用和库函数6.1.1 系统调用系统调用o系统调用是操作系统提供的、与用户程序之间的接口,也系统调用是操作系统提供的、与用户程序之间的接口,也就是操作系统提供给程序员的接口就是操作系统提供给程序员的接口 o系统调用和过程调用的差别:过程调用只能在用户态下运系统调用和过程调用的差别:过程调用只能在用户态下运行,不能进入核心态;而系统调用可以实现从用户态到核行,不能进入核心态;而系统调
2、用可以实现从用户态到核心态的转变。心态的转变。 o系统调用可大致分为五个类别:进程控制、文件管理、设系统调用可大致分为五个类别:进程控制、文件管理、设备管理、信息维护和通信。备管理、信息维护和通信。4.A= A+1 printf(. . .)B=B+A(1)源程序段)源程序段6.1.1 系统调用简介系统调用简介5(2)printf目标代码目标代码(3)程序段编译产生的程序段编译产生的可执行代码可执行代码(4)操作系统操作系统内部代码内部代码INT.INTA=A+1B=B+A.INOUT.嵌入后嵌入后该系统调该系统调用的操作用的操作系统内部系统内部实现代码实现代码6.1.1 系统调用简介系统调用
3、简介6用户程序用户程序函数函数操作系统操作系统o凡是与硬件相关、与应用无关的工作,都通过操凡是与硬件相关、与应用无关的工作,都通过操作系统程序来完成作系统程序来完成6.1.1 系统调用简介系统调用简介7 以以I/O设备的硬件接口为例:设备的硬件接口为例:p一般由四种寄存器(地址,数据,状态,控制)或其一般由四种寄存器(地址,数据,状态,控制)或其子集组成子集组成o任一程序中若要使用任一程序中若要使用I/O设备来输出数据或接受输入设备来输出数据或接受输入o必须通过对这四种寄存器读写的必须通过对这四种寄存器读写的I/O机器指令进行机器指令进行6.1.1 系统调用简介系统调用简介86.1.2系统调用
4、的处理过程系统调用的处理过程o需要有一个类似于硬件中断处理的处理机构需要有一个类似于硬件中断处理的处理机构o当用户使用系统调用时,产生一条相应的指令当用户使用系统调用时,产生一条相应的指令o处理机在执行到该指令时发生相应的中断,并发处理机在执行到该指令时发生相应的中断,并发出有关的信号给该处理机构出有关的信号给该处理机构o该处理机构在收到了处理机发来的信号后,启动该处理机构在收到了处理机发来的信号后,启动相关的处理程序去完成该系统调用所要求的功能相关的处理程序去完成该系统调用所要求的功能9o在系统中为控制系统调用服务的机构称为在系统中为控制系统调用服务的机构称为陷入陷入(TRAP)或异常处理机
5、构或异常处理机构o相对应,把由于系统调用引起处理机中断的指令称相对应,把由于系统调用引起处理机中断的指令称为为陷入或异常指令(或称访管指令)陷入或异常指令(或称访管指令)o在操作系统中,每个系统调用都对应一个事先给定在操作系统中,每个系统调用都对应一个事先给定的功能号,例如的功能号,例如0、1、2、3等,称为系统调用功等,称为系统调用功能号能号(在陷入指令中必须包括对应系统调用的功能号(在陷入指令中必须包括对应系统调用的功能号 有些陷入指令中,还带有传给陷入处理机构和内部处有些陷入指令中,还带有传给陷入处理机构和内部处理程序的有关参数)理程序的有关参数)6.1.2系统调用的处理过程系统调用的处
6、理过程10o必须为实现系统调用功能的子程序编造入口地址必须为实现系统调用功能的子程序编造入口地址表表o每个入口地址与相应的系统调用执行程序名对应每个入口地址与相应的系统调用执行程序名对应o陷入处理程序把陷入指令包含功能号与入口地址陷入处理程序把陷入指令包含功能号与入口地址表有关项对应表有关项对应, , 驱动有关子程序执行驱动有关子程序执行o在系统调用处理结束之后,用户程序需利用系统在系统调用处理结束之后,用户程序需利用系统调用返回结果继续执行调用返回结果继续执行6.1.2系统调用的处理过程系统调用的处理过程11保护现场:保护现场:o进入系统调用处理前,陷入处理机构还需保存处进入系统调用处理前,
7、陷入处理机构还需保存处理机现场理机现场o在系统调用处理结束之后,要恢复处理机现场,在系统调用处理结束之后,要恢复处理机现场,现场被保护在特定的内存区或寄存器中现场被保护在特定的内存区或寄存器中6.1.2系统调用的处理过程系统调用的处理过程12 system call 入口地址表入口地址表 (1)保护处理保护处理现场现场(2)取系统调取系统调用功能号并用功能号并寻找子程序寻找子程序入口入口(3)返回返回A0A1Ai AnA0 A1AiAnSub0Sub1SubiSubn 用户程序用户程序 陷入处理机构陷入处理机构 系统子程序系统子程序系统调用的处理过程系统调用的处理过程136.1.3系统调用的分
8、类系统调用的分类系统功能可分为两部分系统功能可分为两部分o系统自身所需要的系统自身所需要的o作为服务提供给用户的作为服务提供给用户的OS的系统调用的系统调用:p进程控制类系统调用进程控制类系统调用p文件操作类系统调用文件操作类系统调用p进程通信类系统调用进程通信类系统调用p设备管理类系统调用设备管理类系统调用p信息维护类系统调用信息维护类系统调用14进程管理进程管理调用调用说明说明pid=fork()创建与父进程相同的子进程创建与父进程相同的子进程pid=waitpid(pid,&statioc,options) 等待一个子进程终止等待一个子进程终止s=execve(name,argv,env
9、irronp)复制一进程的核心映像复制一进程的核心映像exit(status)中止进程执行并返回中止进程执行并返回status15文件管理文件管理16目录管理目录管理17其他其他18 系统调用方式(系统调用方式(INT)与程序中一般的调用方式的)与程序中一般的调用方式的相相同点同点:o改变指令流程改变指令流程o重复执行和公用重复执行和公用o改变指令流程后需要返回原处改变指令流程后需要返回原处6.1.3系统调用与一般过程调用比较系统调用与一般过程调用比较*19o运行在不同的系统状态运行在不同的系统状态 n一般过程调用,其调用程序和被调用程序都运行在一般过程调用,其调用程序和被调用程序都运行在相同
10、状态:核心态或用户态相同状态:核心态或用户态n系统调用:调用程序在用户态,被调用程序在系统系统调用:调用程序在用户态,被调用程序在系统态态系统调用方式(系统调用方式(INT)与程序中一般的调用方)与程序中一般的调用方式的式的不同点不同点: *20o状态的转换状态的转换一般的过程调用不涉及系统状态的转换,可直接由调用过程一般的过程调用不涉及系统状态的转换,可直接由调用过程转向被调用过程转向被调用过程运行系统调用时,调用和被调用过程在不同系统状态,不允运行系统调用时,调用和被调用过程在不同系统状态,不允许由调用过程直接转向被调用过程许由调用过程直接转向被调用过程 通过软中断机制先由用户态转换为核心
11、态通过软中断机制先由用户态转换为核心态 在在OSOS核心分析后,转向相应的系统调用处理子程序核心分析后,转向相应的系统调用处理子程序系统调用方式(系统调用方式(INT)与程序中一般的调用方)与程序中一般的调用方式的式的不同点不同点: *21o返回问题返回问题n一般过程调用在被调用过程执行完后,返回调用过程一般过程调用在被调用过程执行完后,返回调用过程n抢占式调度的系统中,被调用过程执行完后,系统将抢占式调度的系统中,被调用过程执行完后,系统将对所有要求运行的进程进行优先级分析。如果调用进对所有要求运行的进程进行优先级分析。如果调用进程仍有最高优先级,则返回到调用进程执行;否则,程仍有最高优先级
12、,则返回到调用进程执行;否则,引起重新调度,让优先级最高的进程优先执行。此时,引起重新调度,让优先级最高的进程优先执行。此时,系统把调用进程放入就绪队列。系统把调用进程放入就绪队列。系统调用方式(系统调用方式(INT)与程序中一般的调用方)与程序中一般的调用方式的式的不同点不同点: *22oCALL指令的内部实现过程指令的内部实现过程n返回地址压栈(即该返回地址压栈(即该CALL指令所在的地址)指令所在的地址)n将该将该CALL指令中所含的地址(即被调用代码所在地址)指令中所含的地址(即被调用代码所在地址)送入送入PCoRET指令的内部实现过程指令的内部实现过程n从栈顶弹出返回地址送入程序计数
13、器从栈顶弹出返回地址送入程序计数器PCn 进入方式不同进入方式不同 利用利用int或或trap指令进行系统调用;利用指令进行系统调用;利用call 或或 jmp 指令进入普通的过程调用指令进入普通的过程调用系统调用方式(系统调用方式(INT)与程序中一般的调用方)与程序中一般的调用方式的式的不同点不同点: *23o系统调用是动态调用,而系统调用是动态调用,而CALL调用方式调用方式是静态调用是静态调用系统调用方式(系统调用方式(INT)与程序中一般的调用)与程序中一般的调用方式的方式的不同点不同点: *a. 同一程序中不包含被调用代码同一程序中不包含被调用代码 系统调用是动态调用,程序中不包含
14、被调用代码,系统调用是动态调用,程序中不包含被调用代码,好处:好处:(1)用户程序长度缩短)用户程序长度缩短(2)当)当OS升级时,调用方不必改变升级时,调用方不必改变24o系统调用是动态调用,而系统调用是动态调用,而CALL调用方式调用方式是静态调用是静态调用系统调用方式(系统调用方式(INT)与程序中一般的调用)与程序中一般的调用方式的方式的不同点不同点: *b. 系统调用方式的调用地址和返回地址都是不固定的系统调用方式的调用地址和返回地址都是不固定的 系统调用指令中不包含调用地址系统调用指令中不包含调用地址, 只包含功能号,是只包含功能号,是按功能号(在可执行目标程序中)调用的。按功能号
15、(在可执行目标程序中)调用的。在操作系统内部在操作系统内部 由系统调用处理程序通过系统调用分支表由系统调用处理程序通过系统调用分支表 (OS的一个数据结构)的一个数据结构) 将功能号转换为相应的指令地址将功能号转换为相应的指令地址25.功能号功能号 地址地址显显 示示打打 印印读文件读文件.OS的系统调用分支表的系统调用分支表OS代码代码显示显示打印打印读文件读文件OS用户程序用户程序INT.6.1.3系统调用与一般过程调用比较(续)系统调用与一般过程调用比较(续)266.1.4 库函数库函数o它们本身并不属于操作系统的内核部分它们本身并不属于操作系统的内核部分 o库函数可以分为下面六大类:库
16、函数可以分为下面六大类: 文件管理文件管理 状态信息状态信息 文件修改文件修改 程序设计语言的支持程序设计语言的支持 程序装入和执行程序装入和执行 通信通信 276.1.5 调用方式调用方式o例如,例如,creat系统调用可以创建一个新文件,其函数原型说明如系统调用可以创建一个新文件,其函数原型说明如下:下: #include #include #include int open(const char *path, int oflags);o不同的系统调用所需要的头文件(又称前导文件)是不同的。不同的系统调用所需要的头文件(又称前导文件)是不同的。 286.2 文文 件件 操操 作作6.2.1
17、 有关文件操作的系统调用有关文件操作的系统调用o常用的有关文件操作的系统调用有:常用的有关文件操作的系统调用有:creat,open,close,read,write,lseek,link,unlink,mkdir,rmdir,chdir,chmod等等 o例如:例如: #include #include #include int creat(const char *pathname, mode_t mode); o#include #include #include int open(const char *path, int oflags); int open(const char *pa
18、th, int oflags, mode_t mode); 296.2.2 应用示例应用示例 o/* rdwr.c-The read and write system calls */o#include o#include o#include o#include o#include o#include oint main(void)oo int fd1,fd2,fd3,nbytes;o int flags=O_CREAT|O_TRUNC|O_WRONLY;o char buf10;o if(fd1=open(rdwr.c,O_RDONLY,0644)0)o perror(open rdwr.c
19、);o exit(EXIT_FAILURE);o o if(fd2=open(/dev/null,O_WRONLY)0)o perror(open /dev/null);o exit(EXIT_FAILURE);o oif(fd3=open(/tmp/foo.bar,flags,0644)0)o if(write(fd2,buf,10)0)o perror(write /dev/null);o if(write(fd3,buf,nbytes)0)o perror(write /tmp/foo.bar);o write(STDOUT_FILENO,buf,10);o o close(fd1);o
20、 close(fd2);o close(fd3);o exit(EXIT_SUCCESS);o306.3 进进 程程 控控 制制6.3.1 有关进程控制的系统调用有关进程控制的系统调用o常用的有关进程控制的系统调用有:常用的有关进程控制的系统调用有:fork,exec,wait,exit,getpid,sleep,nice等等 o例如:例如: #include #include pid_t fork(void); o#include #include pid_t getpid(void); pid_t getppid(void); 316.3.2 应用示例应用示例o/*proc1.c演示有关进
21、程操作演示有关进程操作*/o#include o#include o#include o#include oint main(int argc,char *argv)oo pid_t pid,old_ppid,new_ppid;o pid_t child,parent;o parent=getpid(); /*获得本进程的获得本进程的PID*/o if(child=fork()0)o fprintf(stderr,%s:fork of child failed:%sn,argv0,strerror(errno);o exit(1);o o oelse if(child=0) /*此时是子此时是
22、子进程被调度运行进程被调度运行*/o old_ppid=getppid();o sleep(2);o new_ppid=getppid();o o else o sleep(1);o exit(0); /*父进程退父进程退出出*/o o /*下面仅子进程运行下面仅子进程运行*/o printf(Original parent:%dn,parent);o printf(Child:%dn,getpid();o printf(Childs old ppid:%dn,old_ppid);o printf(Childs new ppid:%dn,new_ppid);o exit(0);o326.4进程
23、通信进程通信6.4.1有关进程通信的函数有关进程通信的函数Linux下进程间通信的几种主要手段是下进程间通信的几种主要手段是:o管道(管道(pipe)及命名管道()及命名管道(named pipe)o信号(信号(signal)o消息(消息(message)o共享内存(共享内存(shared memory)o信号量信号量(semaphore)和套接口(和套接口(socket)。)。336.4.2应用示例应用示例 o例如:例如:o#include oint pipe(int filedes2); o#include o#include oint mkfifo(const char *pathnam
24、e, mode_t mode); 346.5 内存管理内存管理 o#include ovoid *malloc(size_t size); o#include ovoid *calloc(size_t nmemb, size_t size); o#include ovoid *realloc(void *ptr, size_t size); o#include ovoid free(void *ptr);356.6GCC编译编译ogcc(GNU project C and C+ compiler)是)是GNU推出的功能强大、性能优越的推出的功能强大、性能优越的C语言编译器,是语言编译器,是GN
25、U的代表作品之一。的代表作品之一。ogcc编译器能将编译器能将C、Fortran,C+语言源程序、目标程语言源程序、目标程序编译、连接成可执行文件,如果没有给出可执行文件的序编译、连接成可执行文件,如果没有给出可执行文件的名字,名字,gcc将生成一个名为将生成一个名为a.out的文件。的文件。ogcc最基本的用法是最基本的用法是 gccoptions filenames36GCC简介简介o编译器则通过后缀来区别输入文件的类别编译器则通过后缀来区别输入文件的类别n.c为后缀的文件,为后缀的文件,C语言源代码文件语言源代码文件n.f为后缀的文件,为后缀的文件,Fortran77语言源代码文件语言源
26、代码文件n.f90为后缀的文件,为后缀的文件,Fortran90语言源代码文件语言源代码文件n.C,.cc或或.cxx为后缀的文件,是为后缀的文件,是C+源代码文件源代码文件n.h为后缀的文件,是程序所包含的头文件为后缀的文件,是程序所包含的头文件n.o为后缀的文件,是编译后的目标文件,也是静态库文为后缀的文件,是编译后的目标文件,也是静态库文件件n.so为后缀的文件,动态库文件为后缀的文件,动态库文件n.a为后缀的文件,是由目标文件构成的静态链接库文件为后缀的文件,是由目标文件构成的静态链接库文件37GCC常用编译参数常用编译参数o-c:只编译,不连接成为可执行文件,编译器只是由:只编译,不
27、连接成为可执行文件,编译器只是由输入的输入的.c等源代码文件生成等源代码文件生成.o为后缀的目标文件,通常为后缀的目标文件,通常用于编译不包含主程序的子程序文件。用于编译不包含主程序的子程序文件。o-o output_filename:确定输出文件的名称为:确定输出文件的名称为output_filename,同时这个名称不能和源文件同,同时这个名称不能和源文件同名。如果不给出这个选项,名。如果不给出这个选项,gcc就给出预设的可执行文就给出预设的可执行文件件a.out。o-g:产生符号调试工具:产生符号调试工具(GNU的的gdb)所必要的符号资所必要的符号资讯,要使用讯,要使用gdb对源代码进
28、行调试,就必须加入这个对源代码进行调试,就必须加入这个选项。选项。38GCC常用编译参数常用编译参数o-O:对程序进行优化编译、连接,采用这个选项,整:对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。接的速度就相应地要慢一些。o-O2:比:比-O更好的优化编译、连接,当然整个编译、更好的优化编译、连接,当然整个编译、连接过程会更慢。连接过程会更慢。39生成库文件生成库文件o静态库静态库
29、ar -crlibmy.amy1.o my2.o my3.oo动态库动态库gcc -shared libmy.somy1.o my2.o my3.o406.7程序维护工具程序维护工具make 为了对大型程序进行维护,减少系统的处为了对大型程序进行维护,减少系统的处理开销,理开销,UNIX/Linux开发环境提供了功能开发环境提供了功能强大的程序维护工具:强大的程序维护工具:make。利用此工具,。利用此工具,程序开发人员只需定义各文件之间的依赖关系程序开发人员只需定义各文件之间的依赖关系及在此基础上所应执行的操作,然后及在此基础上所应执行的操作,然后make工工具根据这些内容,以及各文件的修改
30、或建立日具根据这些内容,以及各文件的修改或建立日期的先后顺序,自动有选择的完成产生新版本期的先后顺序,自动有选择的完成产生新版本的必需操作。的必需操作。41make简介简介 在开发大系统时,经常要将程序划分为许多模块。在开发大系统时,经常要将程序划分为许多模块。各个模块之间存在着各种各样的依赖关系,在各个模块之间存在着各种各样的依赖关系,在Linux中通常使用中通常使用Makefile来管理。来管理。o由于各个模块间不可避免存在关联,所以当一个模由于各个模块间不可避免存在关联,所以当一个模块改动后,其他模块也许会有所更新,当然对小系统块改动后,其他模块也许会有所更新,当然对小系统来说,手工编译
31、连接是没问题,但是如果是一个大系来说,手工编译连接是没问题,但是如果是一个大系统,存在很多个模块,那么手工编译的方法就不适用统,存在很多个模块,那么手工编译的方法就不适用了。了。o与手工编译和连接相比,与手工编译和连接相比,make命令的优点在于他命令的优点在于他只更新修改过的文件,而对没修改的文件则置之不理,只更新修改过的文件,而对没修改的文件则置之不理,并且并且make命令不会漏掉一个需要更新的文件。命令不会漏掉一个需要更新的文件。42一个简单的例子一个简单的例子oa.c和和b.c两个程序两个程序oMakefileo执行执行make43书写书写Makefile文件文件oMakefile是由
32、规则来组成的,每一条规则是由规则来组成的,每一条规则都有三部分组成:目标都有三部分组成:目标(object),依赖,依赖(dependency)和命令和命令(command)。在上面的例子中,在上面的例子中,Makefile只有一条规则,只有一条规则,其目标为其目标为hello,其依赖为,其依赖为a.c b.c,其命,其命令为令为gcc a.c b.c -o hello。44书写书写Makefile文件文件o依赖可以是另一条规则的目标,也可以是文依赖可以是另一条规则的目标,也可以是文件。每一条规则被这样处理,如目标是一个件。每一条规则被这样处理,如目标是一个文件时:如果依赖的时间比目标要新,文
33、件时:如果依赖的时间比目标要新, 则则运行规则所包含的命令来更新目标;如果依运行规则所包含的命令来更新目标;如果依赖是另一个目标则用同样的方法先来处理这赖是另一个目标则用同样的方法先来处理这个目标。如目标不是一个存在的文件时,则个目标。如目标不是一个存在的文件时,则一定执行。一定执行。45一个简单的一个简单的Makefile文件文件o例如:例如:Makefilehello:a.o b.ogcc a.o b.o o hello a.o:a.c gcc c a.c b.o:b.c gcc c b.c46一个简单的一个简单的Makefile文件文件o当运行当运行make时,可以接一目标名时,可以接一目标名(eg:make hello)作为参数,表示要处理作为参数,表示要处理改目标。如没有参数,则处理第一个目标。改目标。如没有参数,则处理第一个目标。ohello依赖于文件目标依赖于文件目标a.o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西贵港市港南中学三文科班2025年物理高二下期末预测试题含解析
- 浙江省公立寄宿学校2025年物理高一第二学期期末经典模拟试题含解析
- 2025年广西南宁市金伦中学、华侨、新桥、罗圩中学物理高二下期末复习检测模拟试题含解析
- 2025届山东省济宁市鱼台一中物理高二第二学期期末检测试题含解析
- 2025届江苏省江阴市暨阳中学高二物理第二学期期末综合测试试题含解析
- 二零二五年度高科技电子产品代理购销合同协议书
- 二零二五年度牛老师个性化技术服务合同下载平台
- 2025版XX个人住房装修贷款合同模板
- 2025版标准仓储物流合同范本
- 二零二五年OEM光伏产品委托制造及安装服务合同
- 秸秆粉碎还田合同范本
- 山西省烟草专卖局(公司)笔试试题2024
- 独龙族女装设计
- 水利安全风险防控“六项机制”与安全生产培训
- (高清版)DB13(J)∕T 295-2019 既有住宅建筑综合改造技术规程
- 鼻出血的课件
- 打包设备转让协议书
- 信用社2025年风险管理工作计划
- 工程入伙合同协议书
- 艺术测评服务合同协议
- 非盗抢车辆协议合同协议
评论
0/150
提交评论