第7章 Linux环境编程 (5学时).ppt
《第7章 Linux环境编程 (5学时).ppt》由会员分享,可在线阅读,更多相关《第7章 Linux环境编程 (5学时).ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 Linux环境编程 本章作业 两个C语言源程序文件image.c和search.c共同完成一项任务,其中:image.c调用了search.h(保存在/temp目录中)中的函数dissort(),search.c使用了search.h中的变量。在Linux环境下用gcc命令进行编译,要求如下:1.生成可执行程序文件名为imgsch;2.加入供调试程序gdb使用的附加信息;请写出:1、gcc编译命令 2、makefile文件编译命令:编译命令:$gcc-I/tmp-gcsearch.c$gcc-I/tmpgcimage.c$gccsearch.oimage.ooimgsch#对对sear
2、ch.c文件单独编译,不进行连接,且告诉编译器头文件的位置文件单独编译,不进行连接,且告诉编译器头文件的位置#对对image.c文件单独编译,不进行连接文件单独编译,不进行连接#连接上述两行命令得到的连接上述两行命令得到的.o文件,生成可执行文件文件,生成可执行文件imgsch该选项,将告诉编译器在目标文件(即.o文件)中加入供调试器gdb使用的附加信息makefile文件的内容:文件的内容:imgsch:search.oimage.ogccsearch.oimage.ooimgschsearch.o:search.csearch.hgcc-I/tmpcsearch.cimage.o:imag
3、e.csearch.hgcc-I/tmpcimage.cclean:rmf*.o目标文件目标文件相依文件相依文件操作命令操作命令 主要内容v系统调用和库函数简介v文件操作v进程管理和同步v进程通信v内存管理7.1 系统调用和库函数v操作系统可以对外提供服务,并且通过不同的方式实现服务;v其中基本的两种服务方式就是:系统调用 和 库函数 也是操作系统提供给用户的两种接口7.1.1 系统调用v系统调用像普通C语言函数调用那样,出现在C语言程序中;v一般的函数调用不能把进程状态从用户态变为内核态,而系统调用却可以,并将进程上下文从用户堆栈切换到系统堆栈。vLinux的系统调用是通过中断指令实现的,v
4、目前Linux系统中共定义了221个系统调用,所有的系统调用都在系统调用入口表中统一管理。基本概念:基本概念:基本概念:基本概念:操作系统和系统调用的关系vv操作系统负责直接与硬件交互,向用户程序提供公共服务,操作系统负责直接与硬件交互,向用户程序提供公共服务,并使它们同硬件特性隔离;并使它们同硬件特性隔离;vv系统调用:系统调用:是是LinuxLinux操作系统向用户程序提供支持的接口,操作系统向用户程序提供支持的接口,通过这些接口,应用程序向操作系统请求服务,控制转向操通过这些接口,应用程序向操作系统请求服务,控制转向操作系统;作系统;而操作系统在完成服务后,将控制和结果返回给用户程序。而
5、操作系统在完成服务后,将控制和结果返回给用户程序。vv在在LinuxLinux系统中进程的两种运行模式:系统中进程的两种运行模式:高优先级的内核模式、低优先级的用户模式。v内核运行在高优先级;v其它外围软件包括shell,编辑程序等都是在低优先级运行。在用户程序执行过程中,如果使用了系统调用,或者发生了中断,就要运行操作系统程序,进程模式变为内核模式。系统进程只运行在内核模式u之所以采取不同的执行模式主要原因是为了保护,由于用户进程在较低的特权级上运行,它们将不能意外或故意破坏其它进程或内核。u用户进程如果要完成内核模式下才能执行的某些功能时,必须严格按照系统调用提供接口,才能进入内核模式,完
6、成相应的功能。#include#include#includeintopen(constchar*path,intoflags);例:系统调用例:系统调用open可以打开一个指定的文件可以打开一个指定的文件使用open时所需包含的头文件系统调用open的使用格式u系统调用可以看作是所有Linux进程共享的、在特权方式下运行子程序库,u系统调用的主要功能是:使用户可以使用操作系统提供的有关设备管理、文件系统、进程控制、进程通讯、存储管理方面的功能,而不必要了解操作系统的内部结构、有关硬件的细节问题,从而减轻用户负担和保护系统以及提高资源利用率。7.1.2 库函数v库函数解决一些共性问题,为程序开
7、发和执行提供方便的环境。如:C语言中常用的fopen()函数就是标准I/O库中的库函数。基本概念:库函数基本概念:库函数基本概念:库函数基本概念:库函数简单地说,是把一些常用到的函数编写完,放到一个文件里供别人用;使用时把它所在的文件名用#include加到里面就可以了,一般是放到lib目录里。库函数运行在用户空间Linux系统分为三个层次:用户、核心以及硬件 系统调用是用户程序与核心间的边界,通过系统调用进程可由用户模式转入内核模式,在内核模式下完成一定的服务请求后在返回用户模式。v库函数可以分为下面六大类:文件管理:对文件、目录进行创建、删除等;状态信息:对日期、时间、内存容量等信息的格式
8、化和存储 文件修改:程序设计语言的支持:程序装入和执行:通信:在进程、用户和不同计算机系统之间,进行信息传送7.1.3 调用方式uLinux系统中,系统调用和库函数都是以C函数的形式,提供给用户的;u在C语言程序中,对系统调用的使用方式和库函数的调用方式相同。即:调用时提供实参的个数和类型等信息;7.2 文 件 操 作v常用的有关文件操作的系统调用有:creat,open,close,read,write,mkdir,rmdir,chdirLinux系统中“文件”的概念涉及内容较广,如:普通文件、设备文件、目录文件7.2.1 有关文件操作的系统调用v例:例:#include#include#i
9、ncludeintcreat(constchar*pathname,mode_tmode);#include#include#includeintopen(constchar*path,intoflags);intopen(constchar*path,intoflags,mode_tmode);创建新文件创建新文件7.2.2 应用示例 下列代码说明,如何对普通文件、设备文件,通过系统调用进行读写和打开操作。其中用到的三个文件:fileexp.c:普通文件 /dev/null:设备文件 /tmp/m1.c 普通文件对文件的打开标志:O_CREAT 如果被打开的文件不存在,则创建它 O_RDON
10、LY 只读方式打开 O_WRONLY 只写方式打开1.#include2.#include3.#include4.#include5.#include6.#include7.intmain(void)8.9.intfd1,fd2,fd3,nbytes;10.charbuf10;11.if(fd1=open(“fileexp.c,O_RDONLY)0)12.perror(openfileexp.c);13.exit(EXIT_FAILURE);14.15.if(fd2=open(/dev/null,O_WRONLY)0)16.perror(open/dev/null);17.exit(EXIT_
11、FAILURE);18.系统调用open所需要包含的头文件显示错误信息20.if(fd3=open(/tmp/m1.c,O_CREAT|O_WRONLY)0)27.if(write(fd2,buf,10)0)28.perror(write/dev/null);29.if(write(fd3,buf,nbytes)0)30.perror(“write/tmp/m1.c);31.write(STDOUT_FILENO,buf,10);32.33.close(fd1);34.close(fd2);35.close(fd3);36.exit(EXIT_SUCCESS);37.使用系统调用read将文件
12、fileexp.c中的内容读出10个字节,存放到char型数组buf中。返回值是实际读取的字节数使用系统调用write,将buf中的信息写入到标准输出,即:显示屏上。回顾第回顾第5章的内容:章的内容:每个进程在创建时自动打开每个进程在创建时自动打开3个文件:个文件:标准输入、标准输出、标注错误输出,标准输入、标准输出、标注错误输出,分别对应文件描述符分别对应文件描述符0,1,2.在在中定义三个宏,中定义三个宏,STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO分别表示这些数字分别表示这些数字.进程控制块使用文件时的逻辑结构进程控制块使用文件时的逻辑结构根目录节点当
13、前目录节点保存该进程打开文件的有关保存该进程打开文件的有关信息。最多打开信息。最多打开256个文件个文件文件在文件在VFS中的索引节点中的索引节点第四章中第四章中I/O重定向中讲到的重定向中讲到的文件描述符(如:文件描述符(如:0,1,2)就是)就是fd数组的下标数组的下标索引节点表7.3 进 程 控 制u进程控制中主要涉及到进程的创建、睡眠和退出等;u进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中 被抽象成各种数据对象:进程控制块、虚存空间、文件系统,信号处理函数u所以创建一个进程的过程就是这些数据对象的创建过程;7.3.1 有关进程控制的系统调用v
14、在Linux中主要提供了fork、exec、clone的进程创建方法,sleep的进程睡眠和exit的进程退出调用;v另外Linux还提供了父进程等待子进程结束的系统调用wait。v操作系统可以对外提供服务,是通过两种不同的方式来实现:系统调用系统调用 和 库函数库函数。知识点回顾:系统调用和库函数知识点回顾:系统调用和库函数应用程序操作系统用户接口系统调用和库函数请求服务返回结果硬件直接交互v例如:例如:#include#includepid_tfork(void);#include#includepid_tgetpid(void);pid_tgetppid(void);创建一个子进程,有创
15、建一个子进程,有两个返回值!两个返回值!返回当前进程的返回当前进程的ID号号返回父进程的返回父进程的ID号号执行原理:操作系统执行fork函数时,会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这是因为:这两个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝;fork fork 的执行原理的执行原理fork的英文意思是?叉子,分叉v可见,fork函数创建新进程后,父子进程按照一定的逻辑完成不同的工作,并拥有彼此独立的数据空间,就像是“分岔”了。这也是它为什么叫fork的原因。v如果父子进程之间需要进行协同操作,可以通
16、过进程通信的不同方法实现。代码空间数据空间数据空间复制父进程子进程fork函数执行效果图父子进程按照一定的逻父子进程按照一定的逻辑选择该空间中的代码辑选择该空间中的代码执行。执行。v执行成功的情况下,两个返回值:若执行成功,则在子子进程中返回值为返回值为0 0,父进程中返回值是子进程的进程ID;v若创建不成功,父进程会返回错误。注意:fork 函数的独特之处编程时需要特别注意!使用方法使用方法使用方法使用方法#include#includepid_tfork(void);pid=fork();if(pid0)/父进程处理程序父进程处理程序elseif(pid=0)/子进程处理程序子进程处理程序
17、else/子进程创建出错子进程创建出错父子进程公用部分父子进程公用部分程序中的常用控制结构使用前的声明在父进程中变量pid的值是子进程的进程号;在子进程中变量pid的值是0fork调用是调用是linux系统中较难理解的概念之一,执行一次却返回两个值。系统中较难理解的概念之一,执行一次却返回两个值。下列程序对此进行实验论证:下列程序对此进行实验论证:下列程序对此进行实验论证:下列程序对此进行实验论证:intmain()inti;intpid;pid=fork();if(pid0)printf(“error”)elseif(elseif(pidpid=0)=0)for(i=1;i3;i+)for(
18、i=1;i3;i+)printf(Thisprintf(Thisischildprocessn);ischildprocessn);elseelsefor(i=1;i3;i+)for(i=1;i3;i+)printf(Thisprintf(Thisisparentprocessn);isparentprocessn);运行过程演示与分析运行过程演示与分析运行过程演示与分析运行过程演示与分析 上述程序中的几个关键步骤:1、用cd命令进入脚本exp1所在文件夹 2、用cat命令查看脚本内容 3、用gcc命令编译脚本,得到可执行文件a.out 4、运行编译生成的可执行文件第2章第6章【课堂提问课堂提
19、问课堂提问课堂提问】为什么为什么ifif和和elseelse部分都执行了?部分都执行了?【解答解答解答解答】forkfork函数执行成功时在函数执行成功时在 if 和和else部分均有符合要求的返回值;部分均有符合要求的返回值;因此,父子进程都被执行了;因此,父子进程都被执行了;而两种输出正式是来自于父子进程的不同执行结果。而两种输出正式是来自于父子进程的不同执行结果。课后作业:请动手实现:在Linux环境中编写、编译、运行上述程序;观察与思考:当循环次数从3次扩大到100次,将出现什么结果?说明什么问题?应用示例应用示例1intcom=0;main()pid_tpid;pid=fork();
20、if(pid0)printf(error);elseif(pid=0)com=1;elsecom=com+1;printfcom=%dn,com;执行结果为:执行结果为:com=1com=1在在fork前父进程的资源子进程可前父进程的资源子进程可以继承,而在以继承,而在fork后子进程没有后子进程没有任何和父进程的继承关系了。任何和父进程的继承关系了。在子进程里创建的资源是子进程在子进程里创建的资源是子进程的,在父进程创建的资源是父进的,在父进程创建的资源是父进程的。可以完全看成两个进程。程的。可以完全看成两个进程。说明:说明:关于进程ID号:PID通常在数值上逐渐增大,因此,子进程的PID一
21、般比父进程大;当超过系统规定的最大值时,就返回来取尚未使用的最小值;如果父进程终止,则子进程会被指定给一个新的父进程。相应的系统调用:getpid()返回当前进程的PIDgetppid()返回父进程的PID#include;#include;main()pid_tpid;pid=fork();if(pid0)printf(“errorinfork!”);elseif(pid=0)printf(“iamthechildprocess,myprocessidis%dn”,getpid();elseprintf(“iamtheparentprocess,myprocessidis%dn”,getpi
22、d();运行的结果是:运行的结果是:应用示例应用示例2$a.outiamthechildprocess,myprocessidis1051iamtheparentprocess,myprocessidis1050$catfork_ex.c#include#includemain()pid_tpid;pid=fork();if(pid0)printf(forkerror!t);elseif(pid=0)printf(childprocessnow!pid=%dppid=%dt,getpid(),getppid();elseprintf(parentprocessnow!pid=%dchild_p
23、id=%dt,getpid(),pid);设父进程设父进程PIDPID为为10501050,子进程的,子进程的PIDPID为为10511051,则输出为?,则输出为?childprocessnow!pid=1051ppid=1050parentprocessnow!pid=1050child_pid=1051#includeintmyvar=0;voidmain()pid_tpid;pid=fork();/systemcallif(pid0)/erroroccurredprintf(“forkfailed.”);exit(EXIT_FAILURE);/systemcallelseif(pid=
24、0)/子进程被调度运行子进程被调度运行printf(“childprocessexecutingn”);myvar=1;else/parentprocesswait();/systemcall,waitforchildrencompletionprintf(“childcomplete.”);myvar+;printf(“father,myvar=%d”,myvar);exit(0);应用示例应用示例3fork与与wait系统调用的结合使用系统调用的结合使用1.#include2.#include3.#include4.#include5.intmain(intargc,char*argv)6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 Linux环境编程 5学时 Linux 环境 编程 学时
限制150内