os操作系统实验指导(2)

2019-08-31 15:43

GNU C编译器的使用

? LINUX上可用的C编译器是GNU C编译器(GCC),一般的Unix下使用的是CC编译器

? 通常后跟一些选项和文件名来使用GCC编译器。基本用法如下: gcc [options] [filenames]

? 通过命令行选项指定编译过程中的具体操作 GNU C编译器的使用 GCC常用选项

? GCC有超过100个的编译选项可用,这些选项中的许多可能永远都不会用到,但一些主要的选项将会频繁使用。很多的GCC选项包括一个以上的字符,因此必须为每个选项指定各自的连字符,并且就像大多数LINUX 命令一样不能在一个单独的连字符后跟一组选项。例如,下面的命令是不同的: gcc -p -g test.c gcc -p test.c

第一条命令告诉GCC编译test.c时为prof命令建立剖析(profile)信息并且把调试信息加入到可执行文件里。第二条命令告诉GCC只为gprof命令建立剖析信息。 GNU C编译器的使用 GCC常用选项

? 当不用任何选项编译一个程序时,GCC将建立(假定编译成功)一个名为a.out的可执行文件。例如, gcc test.c

编译成功后,当前目录下就产生了一个a.out文件。

? 也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。例如: gcc –o count count.c

此时得到的可执行文件就不再是a.out,而是count。 GNU C编译器的使用 执行文件

? 格式: ./可执行文件名 例:./a.out

./count gdb调试工具的使用

? LINUX包含了一个叫gdb的GNU调试程序。gdb是一个用来调试C和C++程序的强有力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。它具有以下一些功能:

?监视程序中变量的值;

?设置断点以使程序在指定的代码行上停止执行; ?一行行的执行代码。 gdb调试工具的使用

? 为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。

? 在编译时用 –g 选项打开调试选项。 gdb调试工具的使用 ? 调试命令

gdb调试工具的使用 应用举例

(1)设有一源程序 test.c

(2)编译,gcc -ggdb –o greet greet.c

(3)gdb greet ,出现提示符(gdb),此时可在提示符下输入gdb的命令了,如: (gdb)run (gdb)list

(4)退出调试状态,返回系统提示符下, (gdb)quit

实验中常用到的系统调用

? 字面上讲,系统调用(也称为“syscall”)就是一条类似于“add”或者“jump”的指令。从更高的层面上讲,系统调用是用户级程序要求操作系统为它做某些事情的途径。

? 首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号(稍后对此进行详述)。注意,所有这些都是由库函数自动完成的,除非您是使用汇编编程。参数设置完成后,程序执行“系统调用”指令。这个指令会导致一个异常:产生一个事件,这个事件会致使处理器跳转到一个新的地址,并开始执行那里的代码。

举例说明:

? fork( ) 创建进程 stdio.h ? wait( )等待子进程运行结束 stdio.h ? exit( )终止进程的执行 stdio.h ? lockf(files,function,size) 锁定文件 unistd.h ? kill( ) 发送信号 signal.h ? signal( ) 预置对信号的处理方式 signal.h

注意:程序中用到系统调用的时候,要包含相关的头文件 如: #include fork( )

? 创建一个新进程。

? 系统调用格式: pid=fork( ) ? 参数定义:int fork( ) ? fork( )返回值意义如下:

0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。

>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。 -1:创建失败。

? 如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。

核心为fork( )完成以下操作:

? 为新进程分配一进程表项和进程标识符

进入fork( )后,核心检查系统是否有足够的资源来建立一个新进程。若资源不足,则fork( )系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。 ? 检查同时运行的进程数目

超过预先规定的最大数目时,fork( )系统调用失败。 ? 拷贝进程表项中的数据

将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。

? 子进程继承父进程的所有文件

对父进程当前目录和所有已打开的文件表项中的引用计数加1。 ? 为子进程创建进程上、下文

进程创建结束,设子进程状态为“内存中就绪”并返回子进程的标识符。 ? 子进程执行

虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC(注意子进程的PC开始位置),然后根据pid变量保存的fork( )返回值的不同,执行了不同的分支语句。

wait( )

? 等待子进程运行结束。如果子进程没有完成,父进程一直等待。wait( )将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait( )前已有子进程暂停或终止,则调用进程做适当处理后便返回。 ? 系统调用格式: int wait(status) int *status;

? 其中,status是用户空间的地址。它的低8位反应子进程状态,为0表示子进程正常结束,非0则表示出现了各种各样的问题;高8位则带回了exit( )的返回值。exit( )返回值由系统给出。

实验中用到的系统调用 核心对wait( )作以下处理:

? 首先查找调用进程是否有子进程,若无,则返回出错码; ? 若找到一处于“僵死状态”的子进程,则将子进程的执行时间加到父进程的执行时间上,并释放子进程的进程表项;

? 若未找到处于“僵死状态”的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。

exit( )

? 终止进程的执行。 ? 系统调用格式: void exit(status) int status;

? 其中,status是返回给父进程的一个整数,以备查考。 ? 为了及时回收进程所占用的资源并减少父进程的干预,UNIX/LINUX利用exit( )来实现进程的自我终止,通常父进程在创建子进程时,应在进程的末尾安排一条exit( ),使子进程自我终止。exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止。

? 如果调用进程在执行exit( )时,其父进程正在等待它的终止,则父进程可立即得到其返回的整数。

核心须为exit( )完成以下操作: ? 关闭软中断 ? 回收资源 ? 写记帐信息

? 置进程为“僵死状态”

lockf(files,function,size)

? 用作锁定文件的某些段或者整个文件。 ? 本函数的头文件为 #include \? 系统调用格式:

int lockf(files,function,size) int files,function; long size;

? 其中:files是文件描述符;function是锁定和解锁:1表示锁定,0表示解锁。size是锁定或解锁的字节数,为0表示从文件的当前位置到文件尾。

kill( )

? 系统调用格式 int kill(pid,sig) int pid,sig;

? 其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。 (1)pid>0时,核心将信号发送给进程pid。

(2)pid=0时,核心将信号发送给与发送进程同组 的所有进程。

(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。

signal( )

? 预置对信号的处理方式,允许调用进程控制软中断信号。 ? 系统调用格式 signal(sig,function) int sig;

void (*func) ( )

? 其中sig用于指定信号的类型,sig为0则表示没有收到任何信号

实验要求:

应独立完成如下工作

? 理解每个实验的目的、原理 ? 思考、编写实验程序 ? 调试、运行实验程序 ? 分析实验结果 ? 撰写实验报告

? 在预习阶段,可以充分利用网上的资源,但是一定要自己独立完成实验程序的编写、调试、运行、分析。


os操作系统实验指导(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:六年级下册英语素材-英语名词单复数变化规律及练习题 - 通用版

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: