版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2014年春季学期A卷、考查、开卷 课程名称 UNIX/Linux操作系统课程实践 命题教师: 适用班级: 答卷说明:1.本试卷共1页,1个大题,满分100分,时间120分钟。 学号: 姓名: 班别:题号一总分评分人得分 一、作品题:(本大题共1大题,共100分)。实践总结要求包括:13500字以上; (10分)2详细论述Linux系统下各目录的主要功能; (10分)3论述shell的基本工作原理 ; (10分)4结合程序实例详细论述常用的5种进程通信方式; (30分)5对进程与线程的区别进行分析; (10分)6结合实例对gccgdbmake的实现方法做详尽论述; (20分) 7结合套接字理论
2、对TCPUDP通信原理进行论述 ; (10分)一、详细论述Linux系统下各目录的主要功能1./bin目录 /bin目录包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。这些命令都是二进制文件的可执行程序(bin是binary - -二进制的简称),多是系统中重要的系统文件。 2./sbin目录 /sbin目录类似/bin,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。 3./etc目录 /etc目录存放着各种系统配置文件,其中包括了用户信息文件 /etc/passwd,系统初始化文
3、件/etc/rc等。linux正是*这些文件才得以正常地运行。 4./root目录 /root目录是超级用户的目录。 5./lib目录 /lib目录是根文件系统上的程序所需的共享库,存放了根文件系统程序运行所需的共享文件。这些文件包含了可被许多程序共享的代码,以避免每个程序都包含有相同的子程序的副本,故可以使得可执行文件变得更小,节省空间。 6./lib/modules目录 /lib/modules目录包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引导系统所需的模块(例如网络和文件系统驱动)。 7./dev目录 /dev目录存放了设备文件,即设备驱动程序,用户通过这些文件访问外部
4、设备。比如,用户可以通过访问/dev/mouse来访问鼠标的输入,就像访问其他文件一样。 8./tmp目录 /tmp目录存放程序在运行时产生的信息和数据。但在引导启动后,运行的程序最好使用/var/tmp来代替/tmp,因为前者可能拥有一个更大的磁盘空间。 9./boot目录 /boot目录存放引导加载器(bootstrap loader)使用的文件,如lilo,核心映像也经常放在这里,而不是放在根目录中。但是如果有许多核心映像,这个目录就可能变得很大,这时使用单独的文件系统会更好一些。还有一点要注意的是,要确保核心映像必须在ide硬盘的前1024柱面内。 10./mnt目录 /mnt目录是系
5、统管理员临时安装(mount)文件系统的安装点。程序并不自动支持安装到/mnt。/mnt下面可以分为许多子目录,例如/mnt/dosa可能是使用msdos文件系统的软驱,而/mnt/exta可能是使用ext2文件系统的软驱,/mnt/cdrom 光驱等等。二论述shell的基本工作原理 Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序。它不属于内核部分,而是在核心之外,以用户态方式运行。其基本功能是解释并执行用户打入的各种命令,实现用户与Linux核心的接口。系统初启后,核心为每个终端用户建立一个进程去执行Shell解释程序。它的执行过程基本上按如下步骤: (1)读取用户
6、由键盘输入的命令行。 (2)分析命令,以命令名作为文件名,并将其它参数改造为系统调用execve( )内部处理所要求的形式。 (3)终端进程调用fork( )建立一个子进程。 (4)终端进程本身用系统调用wait4( )来等待子进程完成(如果是后台命令,则不等待)。当子进程运行时调用execve( ),子进程根据文件名(即命令名)到目录中查找有关文件(这是命令解释程序构成的文件),将它调入内存,执行这个程序(解释这条命令)。 (5)如果命令末尾有&号(后台命令符号),则终端进程不用系统调用wait4( )等待,立即发提示符,让用户输入下一个命令,转。如果命令末尾没有&号,则终端
7、进程要一直等待,当子进程(即运行命令的进程)完成处理后终止,向父进程(终端进程)报告,此时终端进程醒来,在做必要的判别等工作后,终端进程发提示符,让用户输入新的命令,重复上述处理过程。三、结合程序实例详细论述常用的5种进程通信方式linux使用的进程间通信方式:(1)管道(pipe)(2)信号(signal)(3)消息队列(4)共享内存(5)信号量1、 管道通信普通的Linuxshell都允许重定向,而重定向使用的就是管道。例如:ps|grepvsftpd.管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,
8、读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。管道的创建fifo_write.c#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <
9、stdlib.h>#include <string.h>#define FIFO_SERVER "/tmp/myfifo"main(int argc,char* argv)int fd;char w_buf100;int nwrite;/*打开管道*/fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);if(argc=1)printf("Please send somethingn");exit(-1);strcpy(w_buf,argv1);/* 向管道写入数据 */if(nwrite=write(f
10、d,w_buf,100)=-1)if(errno=EAGAIN)printf("The FIFO has not been read yet.Please try latern");else printf("write %s to the FIFOn",w_buf);fifo_read.c#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <fcntl.h>#include <stdio.h>#include
11、 <stdlib.h>#include <string.h>#define FIFO "/tmp/myfifo"main(int argc,char* argv)char buf_r100;int fd;int nread;/* 创建管道 */if(mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST)printf("cannot create fifoservern");printf("Preparing for reading bytes.n")
12、;memset(buf_r,0,sizeof(buf_r);/* 打开管道 */fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);if(fd=-1)perror("open");exit(1);while(1)memset(buf_r,0,sizeof(buf_r);if(nread=read(fd,buf_r,100)=-1)if(errno=EAGAIN)printf("no data yetn");printf("read %s from FIFOn",buf_r);sleep(1);pause(); /*
13、暂停,等待信号*/unlink(FIFO); /删除文件2、信号信号概述 信号是软件中断。它用于在一个或多个进程之间传递异步信号。很多条件可以产生一个信号。A、当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGINT)。这是停止一个已失去控制程序的方法。 B、硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对于执行一个无效存储访问的进程产生一个SIGSEGV。 C、进程用kill(2)函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进和发送信号进程的所
14、有都必须相同,或发送信号进程的的所有者必须是超级用户。 D、用户可用Kill(ID值)命令将信号发送给其它进程。此程序是Kill函数的界面。常用此命令终止一个失控的后台进程。 E、当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被0除),而是软件条件。例如SIGURG(在网络连接上传来非规定波特率的数据)、SIGPIPE(在管道的读进程已终止后一个进程写此管道),以及SIGALRM(进程所设置的闹钟时间已经超时)。 内核为进程生产信号,来响应不同的事件,这些事件就是信号源。主要信号源如下:(1)异常:进程运行过程中出现异常; (2)其它进程:一个进程可
15、以向另一个或一组进程发送信号;(3)终端中断:Ctrl-c,Ctro-等; (4)作业控制:前台、后台进程的管理; (5)分配额:CPU超时或文件大小突破限制;(6)通知:通知进程某事件发生,如I/O就绪等;(7)报警:计时器到期;Linux中的信号 1、SIGHUP 2、SIGINT(终止) 3、SIGQUIT(退出) 4、SIGILL5、SIGTRAP 6、SIGIOT 7、SIGBUS 8、SIGFPE 9、SIGKILL 10、SIGUSER 11、SIGSEGVSIGUSER 12、SIGPIPE 13、SIGALRM14、SIGTERM 15、SIGCHLD 16、SIGCONT
16、17、SIGSTOP 18、SIGTSTP19、SIGTTIN 20、SIGTTOU 21、SIGURG 22、SIGXCPU 23、SIGXFSZ24、SIGVTALRM 25、SIGPROF 26、SIGWINCH 27、SIGIO 28、SIGPWR 常用的信号: SIGHUP:从终端上发出的结束信号;SIGINT:来自键盘的中断信号(Ctrl+c)SIGQUIT:来自键盘的退出信号; SIGFPE:浮点异常信号(例如浮点运算溢出);SIGKILL:该信号结束接收信号的进程; SIGALRM:进程的定时器到期时,发送该信号;SIGTERM:kill命令生出的信号; SIGCHLD:标识子
17、进程停止或结束的信号;SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止扫行信号 可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。 (1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的,原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是示定义的。 (2)捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。如果捕捉到SIGCHLD
18、信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态。 (3)执行系统默认动作。对大多数信号的系统默认动作是终止该进程。每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作: (1)异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。(2)退出(exit):不产生core文件,直接终止进程。(3)忽略(ignore):忽略该信号。(4)停止(stop):挂起该进程。(5)继续(contiune):如果进程被挂起,刚恢复
19、进程的动行。否则,忽略信号。信号的发送与捕捉kill()和raise()kill()不仅可以中止进程,也可以向进程发送其他信号。与kill函数不同的是,raise()函数运行向进程自身发送信号#include<sys/types.h>#include<signal.h> int kill(pid_tpid,intsigno);int raise(intsigno); 两个函数返回:若成功则为0,若出错则为-1。kill的pid参数有四种不同的情况: (1)pid>0将信号发送给进程ID为pid的进程。 (2)pid=0将信号发送给其进程组ID等于发送进程的进程组I
20、D,而且发送进程有许可权向其发送信号的所有进程。 (3)pid<0将信号发送给其进程组ID等于pid绝对值,而且发送进程有许可权向其发送信号的所有进程。如上所述一样,“所有进程”并不包括系统进程集中的进程。(4)pid=-1POSIX.1未定义种情况kill.c #include<stdio.h>例子如下:#include <signal.h>#include <stdio.h>#include <stdlib.h>void my_func(int sign_no)if(sign_no=SIGINT)printf("I have
21、get SIGINTn");else if(sign_no=SIGQUIT)printf("I have get SIGQUITn");int main()printf("Waiting for signal SIGINT or SIGQUIT n ");/*注册信号处理函数*/signal(SIGINT, my_func);signal(SIGQUIT, my_func);pause();exit(0);3、消息队列消息队列用于运行于同一台机器上的进程间通信,它和管道很相似,是一个在系统内核中用来保存消息的队列,它在系统内核中是以消息链表的形
22、式出现。消息链表中节点的结构用msg声明。例子如下:#include <sys/types.h>#include <sys/msg.h>#include <unistd.h>struct msg_buf int mtype; char data255; ; int main() key_t key; int msgid; int ret; struct msg_buf msgbuf; key=ftok("/tmp/2",'a'); printf("key =%xn",key); msgid=msgget
23、(key,IPC_CREAT|0666); /*通过文件对应*/ if(msgid=-1) printf("create errorn"); return -1; msgbuf.mtype = getpid(); strcpy(msgbuf.data,"test haha"); ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT); if(ret=-1) printf("send message errn"); return -1; memset(&msgbu
24、f,0,sizeof(msgbuf); ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT); if(ret=-1) printf("recv message errn"); return -1; printf("recv msg =%sn",msgbuf.data); 4、共享内存 共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行 读写。得到共享内存有两种方式:映射/dev
25、/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的将是 实际的物理内存,在Linux系统下,这只有通过限制Linux系统存取的内存才可以做到。常用的方式是通过shmXXX函数族来实现利 用共享内存进行存储的。 首先要用的函数是shmget,它获得一个共享存储标识符。 #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int flag); 这个函数有点类似malloc函数
26、,系统按照请求分配size大小的内存用作共享内存。Linux系统内核中每个IPC结构都有的一个非负整数 的标识符,这样对一个消息队列发送消息时只要引用标识符就可以了。这个标识符是内核由IPC结构的关键字得到的。这个关键字,就是上面第一个函数的 key。数据类型key_t是在头文件sys/types.h中定义的,它是一个长整形的数据。 当共享内存创建后,其余进程可以调用shmat()将其连接到自身的地址空间中。 void *shmat(int shmid, void *addr, int flag); shmid为shmget函数返回的共享存储标识符,addr和flag参数决定了以什么方式来确定
27、连接的地址,函数的返回值即是该进程数据段所连接的实际地址,进程可以对此进程进行读写操作。 例子如下:#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define PERM S_IRUSR
28、|S_IWUSR/* 共享内存 */int main(int argc,char *argv) int shmid; char *p_addr,*c_addr; if(argc!=2) fprintf(stderr,"Usage:%sna",argv0); exit(1); /* 创建共享内存 */if(shmid=shmget(IPC_PRIVATE,1024,PERM)=-1) fprintf(stderr,"Create Share Memory Error:%sna",strerror(errno); exit(1); /* 创建子进程 */if
29、(fork() / 父进程写 p_addr=shmat(shmid,0,0); memset(p_addr,'0',1024); strncpy(p_addr,argv1,1024);wait(NULL); / 释放资源,不关心终止状态exit(0); else / 子进程读 sleep(1); / 暂停1秒c_addr=shmat(shmid,0,0); printf("Client get %sn",c_addr); exit(0); 5、 信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。
30、本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作: (1) 测试控制该资源的信号量。 (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。 (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。 (4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。例子如下:intopen_semaphore_set(key_t keyval,int numsems) intsid; if(!numsems)
31、return(-1); if(sid=semget(mykey,numsems,IPC_CREAT|0660)=-1) return(-1); return(sid); ;semop() 系统调用:semop(); 调用原型:int semop(int semid,struct sembuf*sops,unsign ednsops); 返回值:0,如果成功。-1,如果失败:errno=E2BIG(nsops大于最大的ops数目四、对进程与线程的区别进行分析进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度
32、和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保
33、护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.2) 线程的划分尺度小于进程,使得多线程程序的并发性高。3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从 而极大地提高了程序的运行效率。4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一
34、个程序运行 的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依 存 在应用程序中,由应用程序提供多个线程执行控制。5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可 以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现 进程的调度和管理以及资源分配。五、结合实例对gccgdbmake的实现方法做详尽论述Gcc 编译流程分为4个步骤: 预处理(Pre-Processing) ; 编译(Compiling) ; 汇编(Assembling) ; 链接(Linking) 。 (1)预处理阶段 在该阶段,编译器将头文件编译进来,并且用户可以使用Gcc的选项
35、“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。 (2)编译阶段 Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 (3)汇编阶段 汇编阶段是把编译阶段生成的“.s”文件转成目标文件,在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。 (4)链接阶段 在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。 函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入
36、到可执行文件中。其后缀名一般为“.a” 。动态库与之相反,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so” 库。Gcc在编译时默认使用动态库。 2、 格式及选项参数 Gcc指令的一般格式为:Gcc 选项 要编译的文件 选项 目标文件 (1) . 总体选项 后缀名 所对应的语言 -c 只是编译不链接,生成目标文件“.o” -S 只是编译不汇编,生成汇编代码 -E 只进行预编译,不做其他处理 -g 在可执行程序中包含标准调试信息 -o file 把输出文件输出到file里 -v 打印出编译器内部编译各过程的命令行信息和编译器的版本 -I dir (大写i
37、) 在头文件的搜索路径列表中添加dir目录 -L dir 在库文件的搜索路径列表中添加dir目录 -static 链接静态库 -llibrary 连接名为library的库文件 (2) . 告警和出错选项 选项 含 义 -ansi 支持符合ANSI标准的C程序 -pedantic 允许发出ANSI C标准所列的全部警告信息 -pedantic-error 允许发出ANSI C标准所列的全部错误信息 -w 关闭所有告警 -Wall 允许发出Gcc提供的所有有用的报警信息 -werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 (3)优化选项 Gcc可以对代码进行优化,它通过编
38、译选项“-On”来控制优化代码的生成,其中 n是一个代表优化级别的整数。对于不同版本的 Gcc 来讲,n 的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到 2或 3。 (4)体系结构相关选项 选项 含义 -mcpu=type 针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、pentium及i686等 -mieee-fp 使用IEEE标准进行浮点数的比较 -mno-ieee-fp 不使用IEEE标准进行浮点数的比较 -msoft-float 输出包含浮点库调用的目标代码 -mshort 把int类型作为16位处理,相当于short int -m
39、rtd 强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令GDP调试器1、Gdb 调试器是一款 GNU 开发组织并发布的 UNIX/Linux 下的程序调试工具 使用格式是: gdb 选项 + gdc编译过的文件 ; 里面的选项参数: 查看文件: (list); 设置断点: (breakpoint); 例: b 8 ;/就是在第8行设置断点 查看断点: infob 运行代码: r(run) 查看变量值: p变量名 单步运行: s(step), n(next) /两者间的区别在于:若有函数调用的时候, “s”会进 入该函数而“n”不会进入该函数。因此, “s”就类似于 VC
40、等工具中的“step in” (F11), “n”类似与VC等工具中的“step over” (F10)。 恢复程序运行: c(continue) 别名: aliases 指其他命令的别名 断点 : breakpoints 使计划在指定的点停止 数据 : data 检查数据 Gdb的使用切记点: · 在Gcc编译选项中一定要加入“-g”。 · 只有在代码处于“运行”或“暂停”状态时才能查看变量值。 · 设置断点后程序在指定行之前停止。 2、工作环境相关命令 Gdb中不仅可以调试所运行的程序,而且还可以对程序相关的工作环境进行相应的 设定,甚至还可以使用 shell
41、 中的命令进行相关的操作,其功能极其强大。 命令格式 含义 set args运行时的参数 指定运行时参数,如set args 2 show args 查看设置好的运行参数 path dir 设定程序的运行路径 show paths 查看程序的运行路径 set enVironment var =value 设置环境变量 show enVironment var 查看环境变量 cd dir 进入到dir目录,相当于shell中的cd命令 pwd 显示当前工作目录 shell command 运行shell的command命令 3、 设置断点与恢复命令 命令格式 含义 bnfo b 查看所设断点 b
42、reak 行号或函数名 <条件表达式> 设置断点 tbreak 行号或函数名 <条件表达式> 设置临时断点,到达后被自动删除 delete 断点号 删除指定断点,其断点号为“info b”中的第一栏。 若缺省断点号则删除所有断点 disable断点号 停止指定断点,使用“info b”仍能查看此断点。同 delete一样,省断点号则停止所有断点 enable 断点号 激活指定断点,即激活被disable停止的断点 condition 断点号 <条件表达式> 修改对应断点的条件 ignore 断点号<num> 在程序执行中,忽略对应断点num次 s
43、tep 单步 恢复程序运行,且进入函数调用 next 单步恢复程序运行,但不进入函数调用 finish 运行程序,直到当前函数完成返回 c 继续执行函数,直到函数结束或遇到新的断点 4、 gdb 中源码查看相关命令 命令格式 含义 list <行号>|<函数名> 查看指定位置代码 file 文件名 加载指定文件 forward-search 正则表达式 源代码前向搜索 reverse-search 正则表达式 源代码后向搜索 dir dir 停止路径名 show directories 显示定义了的源文件搜索路径 info line 显示加载到Gdb内存中的代码 5、
44、gdb中查看运行数据相关命令 gdb中查看运行数据是指当程序处于“运行”或“暂停”状态时,可以查看的变量及表达式信息。 命令格式 含义 print 表达式|变量 查看程序运行时对应表达式和变量的值 x <n/f/u> 查看内存变量内容。其中n为整数表示显示内存的长度,f表示 显示 display 表达式 的格式,u表示从当前地址往后请求显示的字节数 6、Gdb 中修改运行参数相关命令 Gdb 还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set 变量设定值” 。makemake 在执行时,需要一个命令为makefile
45、的文件。makefile文件描述了整个工程的编译,连接等规则。其中包括:工程中的那些源文件需要编译以及如何编译,需要创建那些库文件以及如何创建,如何产生最后我们想要的可执行文件。makefile(术语)规则:用于说明如何生成一个或多个目标文件 规则格式:targets:prerequisitescommand 目标:依赖 命令例:main.o:main.c gcc c main.c在 makefile中,规则的顺序是很重要的,因为,makefile中只应该有一个最终目标,其他的目标都是被这个目标连带出来的,所以一定要让makefile知道你的最终目标是什么, 一般来说,定义在makefile中的目标可能会有很多,但是第一条规则中的目标被却定位最终目标make命令默认在当前目录下寻找名字为makefile或者makefile的工程文件,当名字部位这两者之一时,可以使用如下方法指定: make f 文件名 伪目标:Makefile 中 把那些没有任何依赖只有执行动作的目标称为“伪目标”(phony targets)例: .PHONY:clean clean:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度工程安装居间合同2篇
- 项目经理合作协议书 2篇
- 售房补充协议 3篇
- 化妆品销售合同简单范本
- 高二期中家长会课件
- 饮品购销合同书范本
- 2024年度高速公路沥青混凝土搅拌站租赁合同2篇
- 基于AR技术的虚拟展览服务合同(2024版)
- 股权转让协议书范本合同范本标准版
- 《技术员岗位职责》课件
- 2024新版《药品管理法》培训课件
- 高空作业时的安全注意事项
- 智研咨询发布:中国铜铝复合板带行业竞争格局及发展前景研究报告
- 初三毕业班课件2024-2025学年期中家长会
- 深圳2020-2024年中考英语真题复习专题01 语法填空(解析版)
- 更换阀门施工方案
- 企业财务会计电子教案 10存货核算4
- 定期体检 预防常见病 课件 2024-2025学年人教版(2024)初中体育与健康七年级全一册
- 现代服务业课件
- 2024年国家公务员考试《行测》真题卷(行政执法)答案和解析
- 生活饮用水、公共场所卫生管理系列国家强制性标准解读答案-2024年全国疾控系统“大学习”活动
评论
0/150
提交评论