1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,xx,*,Linux,编程基础,1,应用编程基础,应用程序编译,文件操作,进程操作,进程间通信,2,应用程序的编译,GNU,工具链,GNU,是“,GNUs Not Unix”,的递归缩写,Richard Stallman,创立自由软件基金会(,Free Software Foundation,)支持,GNU,计划,GNU,软件遵守协议,:,GPL,:,GNU,通用公共许可证(,GNU General Public License,),LGPL,:,GNU,较宽松公共许可证,(GNU Lesser Gene
2、ral Public License,),GFDL,:,GNU,自由文档许可证(,GNU Free Documentation License,),GCC,(,G,NU,C,ompiler,C,ollection,,,GNU,编译器集合),GNU,工具与,Linux,的结合,:GNU/Linux,www.gnu.org/,3,xx,4,2025/12/18 周四,应用程序的编译,GNU,工具链组成,Binutils,:,一组用于编译、链接、汇编和其他调试目的的程序,包括ar,as,ld,nm,objcopy,objdump,ranlib,readelf,size,strings,strip等。
3、gcc,:gnu的编译器集合,Linux环境,使用的,C语言编译器,glibc,:,gnu,的,C,语言标准函数库。该库实现,Linux,系统函数,例如,open,、,read,等,也实现标准,C,语言库,如,printf,等。几乎所有应用程序都需要与,glibc,链接。,4,应用程序的编译,GCC,集成了多种编译器的编译程序,支持,C,C+,Fortran,Java,等语言,可执行文件名字,gcc,,也可以使用单一语言的编译器,命令行启动,gcc hello.c,完成编译和连接生成,a.out,可执行程序,执行此程序,./a.out,5,应用程序的编译,GCC,编译选项,从,C,语言源程序
4、生成可执行代码文件的过程,预处理,编译(生成汇编代码),汇编,连接,GCC,用文件名后缀判断编译类型,也可用,-x,选项强迫,GCC,从哪个阶段开始,用,-c,-S,-E,选项让编译到某一步结束,-c,:编译或汇编源文件,不连接,输出,.o,文件,-S,:编译后停止,不进行汇编,生成汇编代码,.s,文件,-E,:预处理后停止,不编译,预处理后送到,stdout,用,-o file,指定输出文件名,哪一个阶段都有效,。,例如:,gcc hello.c o hello,6,应用程序的编译,GCC,文件类型约定*,file.c:,必须处理的,C,源文件,file.i:,不应被预处理的,C,源文件,f
5、ile.ii,:不应被预处理的,C+,源文件,file.h:C,头文件(不被编译和连接),file.cc,file.cp,file.cpp,,,file.cxx,file.c:,必须预处理的,C+,源文件,file.s:,汇编源程序,file.S:,必须预处理的汇编程序,其他:其他扩展名的文件都被作为连接时使用的目标文件,7,应用程序的编译,GNU make,工具和,Makefile,命令行调用,gcc,只能处理简单的源文件较少的程序,复杂的软件项目包含大量源程序和头文件,需要借助,make,工具来自动编译。,GNU,make,工具,:,自动化管理工具,管理软件编译的内容、方式和时机,自动处理
6、源文件模块之间的包含和引用关系,方便将软件项目的代码分开放在多个源文件中,只对更新的代码进行编译,提高工作效率。,文件,Makefile,用来告诉,make,工具如何根据依赖的源文件产生目标代码,make,工具也可以用来进行一般的文件处理,从多个输入文件来产生输出文件。,8,应用程序的编译,代码的,Build,过程,Build,工具的目标,:,使用,build,命令从输入文件,(,依赖文件,),产生可执行文件,(,目标,),可以同时产生多个目标(例如,ARM,,,X86,,,DSP,),方法:命令行,脚本工具,make,Build,工具,Build,指令,源文件,“,D,ependencies
7、app.c,app.cfg,app.h,app.x64P,app.xv5T,app.x470MV,app.x86U,可执行文件,“,T,argets,”,app.o,app.lib,“,D,”,“,CMD,”,“,T,”,9,应用程序的编译,基于命令行的,build,从输入文件,app.c,产生一个目标文件,app.o,gcc g c app.c o app.o,从目标代码,app.o,产生一个可执行文件,(app.x86U),gcc g app.o o app.x86U,命令,command,flag,dependency,flag,target,Command Line,依赖文件,a
8、pp.c,app.o,app.o,app.x86U,目标,“D”,“CMD”,“T”,-c=compile only,-g=build with debug enabled,-o=output filename,10,应用程序的编译,利用,Makefile,的基本规则,make,依赖文件,app.c,app.o,app.o,app.x86U,目标,“D”,“CMD”,“T”,多种脚本工具可用,例如,GNU make,即,gMake,Make,利用规则来指定构建命令,依赖文件文件和构建目标,Make,规则的一般形式,Makefile,TARGET:DEPENDENCY,TAB COMMANDS,
9、11,应用程序的编译,利用,Makefile,的基本规则,TARGET:DEPENDENCY,TAB COMMANDS,命令行 变为简单的,Makefile,规则,app.x86U :app.o,gcc g app.o o app.x86U,规则,gcc g app.o o app.x86U,command,flag,dependency,flag,target,当,目标,app.x86U,依赖,的,app.o,比较它自己更新时,执行其后的,命令,gcc,。,12,应用程序的编译,简单的,Makefile*,make,依赖文件,app.c,app.o,app.o,app.x86U,目标,“D”
10、CMD”,“T”,Makefile,gcc c g app.c o app.o,gcc g app.o o app.x86U,命令行,#Makefile for app.x86U(,目标,),app.x86U:app.o,gcc g app.o o app.x86U,app.o:app.c,gcc g c app.c o app.o,Makefile,13,应用程序的编译,用户定义变量和包含文件,用户定义变量简化,Makefile,增加可读性,包含文件可以指定路径等,include path.mak,CC:=$(CC_DIR)gcc,CFLAGS:=-g,LINK_FLAGS:=-o,ap
11、p.x86U:app.o,$(CC)$(CFLAGS)$(LINK_FLAGS)$,CC_DIR:=/usr/bin/,.,#other paths go here,Makefile,path.mak,变量定义、赋值,$,变量名:引用自定义变量,引用内建变量,14,应用程序的编译,使用内建变量,使用,make,的内建变量简化,Makefile,增加可读性,$=,目标名,$=,所有依赖文件,$010000000000.,832)=832,.,22,文件操作,访问文件的两级接口,低级函数,(,基于文件描述符,),用来访问设备驱动和系统调用,主要包括,open,:,打开文件和设备,read,:,读打
12、开的文件,/,设备,write,:,写文件或设备,close,:,关闭文件,/,设备,ioctl,:,向设备驱动传递控制信息,低级函数对应一个系统调用,高级接口由标准库函数提供。例如头文件,stdio.h,中定义的函数属于,标准,I/O,函数,库,这些函数可以提供输出缓冲。,23,文件操作,文件描述符,每个运行的程序称为一个进程,拥有若干与之关联的文件描述符。,文件描述符是非负整数,用来访问文件或设备。,当一个进程请求打开或建立一个文件时,,Linux,内核会返回一个与该进程关联的文件描述符。,当一个程序启动时,系统通常会给它打开了,3,个文件描述符:,0,:标准输入,STDIN_FILENO
13、1,:标准输出,STDOUT_FILENO,2,:标准错误输出,STDERR_FILENO,24,文件操作,低级文件访问 :,write,write,系统调用将缓冲区,buf,中的数据的前面,nbytes,字节写入文件描述符,fildes,指定的文件中,返回实际读取的字节数。,#include,size_t,write,(int fildes,const void*buf,size_t nbytes);,/*simple_write.c */,#include,#include,int main(),if(write(1,“Here is some datan”,18)!=18),write
14、2,“A write error has occurred!n”,30);,exit(0);,$,./simple_write,Here is some data,$,25,文件操作,低级文件访问 :,read,Read,从文件描述符指定的文件中读取最多,nbytes,字节,将它们放在数据缓冲区,buf,中,返回实际读取的字节数。,#include,size_t,read,(int fildes,void*buf,size_t nbytes);,#include,int main(),char buffer128;,int nread;,nread=read(0,buffer,128);,i
15、f(nread=-1),write(2,“A read error has occurredn”,26);,if(write(1,buffer,nread)!=nread),write(2,“A write error has occurredn”,27);,从标准输入读入最多128字节,然后写到标准输出.,26,xx,27,2025/12/18 周四,文件操作,低级文件访问 :,read,Read,从文件描述符指定的文件中读取最多,nbytes,字节,将它们放在数据缓冲区,buf,中,返回实际读取的字节数。,#include,size_t read(int fildes,void*buf,s
16、ize_t nbytes);,#include,#include,int main(),char buffer128;,int nread;,nread=read(0,buffer,128);,if(nread=-1),write(2,“A read error has occurredn”,26);,if(write(1,buffer,nread)!=nread),write(2,“A write error has occurredn”,27);,$,echo hello there|./simple_read,hello there,$,./simple_read draft1.txt,
17、In this chapter we will be looking at files and directories and how to manipulate them.We will learn how to create files,$,27,文件操作,低级文件访问 :,open,open,系统调用建立一个新的文件描述符,它建立一个访问一个文件或设备的通道。成功时返回一个文件描述符,(,非负整数,),,失败时返回,-1,。,文件描述符是唯一的,不会与其它进程共享。,参数,path,是要打开的文件或设备路径名;,参数,oflags,用来说明打开文件要完成的动作。它是一个必要的访问模式和其
18、他可选模式的组合。,参数,mode,只有当动作是建立新文件时才需要。,#include,int,open,(const char*path,int oflags);,int,open,(const char*path,int oflags,mode_t mode);,28,文件操作,低级文件访问 :,open,int open(const char*path,int,oflags,mode_t mode);,基本文件访问模式,Mode Description,O_RDONLY Open for read-only,O_WRONLY Open for write-only,O_RDWR Open
19、 for reading and writing,可选的文件访问模式,Mode Description,O_APPEND:,把数据添加到文件尾部,.,O_TRUNC:,设置文件长度为,0,丢弃已有的内容,.,O_CREAT:,若需要则按照指定的权限创建该文件,.,O_EXCL:,与,O_CREAT,一起使用,保证调用者建立文件。,其中之一与可选模式进行“,|”,组合,29,文件操作,建立文件时指定初始访问权限,int open(const char*path,int oflags,mode_t mode);,以,O_CREAT,作为,offlag,标志调用,open,建立新文件时,必须使用第三
20、个参数,mode,,其取值是由,sys/stat.h,中定义的标志按位,OR,组合得到。,Read permission,Write permission,Execute permission,Owner,S_IRUSR,S_IWUSR,S_IXUSR,Group,S_IRGRP,S_IWGRP,S_IXGRP,Other,S_IROTH,S_IWOTH,S_IXOTH,open(“myfile”,O_CREAT,S_IRUSR|S_IXOTH);,$,ls-ls myfile,0-r-x 1 neil software 0 Sep 22 08:11 myfile*,Example:,30,文
21、件操作,低级文件访问,close,用,close,中止文件描述符,fildes,与文件的关联,使得该文件描述符可以被重新使用。,成功关闭返回,0,,否则返回,-1,。,#include,int close(int fildes);,31,文件操作,低级文件访问,ioctl,ioctl,用来对文件描述符,fildes,代表的对象实施某种控制功能,功能由参数,cmd,指定。,函数还可以带有更多参数,取决于特定设备支持的具体功能。,例如,让,Linux,打开键盘上的,LED,显示,:,#include,int,ioctl,(int fildes,int cmd,.);,ioctl(tty_fd,KD
22、SETLED,LED_NUM|LED_CAP|LED_SCR);,32,文件操作,低级文件访问,lseek,lseek,用来设定读写文件的指针,确定对文件的下次读写操作的位置。,Offset,参数给定相对于,whence,指定位置的偏移量。,Whence,参数可以为:,该调用成功时返回设定位置距离文件起始位置的字节偏移量,失败时返回,-1,。,#include,#include,off_t,lseek,(int fildes,off_t offset,int whence);,SEEK_SET:offset,为绝对位置,SEEK_CUR:offset,相对于当前位置,SEEK_END:offs
23、et,相对于文件结尾,33,文件操作,标准输入,/,输出的重新定向*,打开文件得到的新文件描述符总是可用的最小数值,这在某些场合是非常有用的。,例如,重新定向标准输出到一个文件,:,#include,#include,int main(),int fd;,close(1);,fd=,open(Myfile,O_WRONLY);,if(fd!=-1),printf(,Add a line to Myfile.n);,write(fd,“Output to a file!n”,19);,close(fd);,34,文件操作,标准,I/O,函数库,标准,I/O,库,(stdio),及其头文件,std
24、io.h,提供了灵活多样的函数来连接底层,I/O,系统调用。,此标准库现在是,ANSI,标准,C,的一部分,提供复杂的输出格式和输入扫描格式,对某些设备,提供缓冲服务,。,需要打开一个文件建立访问通道。打开的文件用一个指向数据结构的,指针,FILE*,来表示,作为其他,IO,函数的引用参数。标准,IO,函数将文件内容看成是数据流。,当程序启动时系统自动打开,3,个,流文件,,即,stdin,stdout,和,stderr,代表标准输入、标准输出和错误输出,分别对应于底层文件描述符,0,1,和,2,。,35,文件操作,标准,I/O,函数库,在头文件,stdio.h,定义的函数包括以下常用函数,相
25、对于底层文件访问函数,高层函数我们更为熟悉,在此不多讨论。,fopen,fclose,fread,fwrite,fflush,fseek,fgetc,getc,getchar,fputc,putc,putchar,fgets,gets,printf,fprintf,and sprintf,scanf,fscanf,and sscanf,36,xx,37,2025/12/18 周四,文件操作,标准,I/O,函数的类型,标准,I/O,提供三种类型的缓存,全缓冲:当填满,I/O,缓存后才进行实际的,I/O,操作;,行缓冲:当在输入和输出中遇到新换行符,(n),时,进行,I/O,操作;,不带缓冲:标准
26、I/O,库不对字符进行缓冲,例如,stderr,;,fopen,函数返回一个,FILE*,指针,指向对应的数据流,打开文件分为文本文件和二进制文件,二进制文件可用,fread,和,fwrite,函数读写,文本文件可用字符读写函数操作,字符输入输出:,fgetc(),和,fputc(),,一次仅读写一个字符,行输入输出:,gets(),,,puts(),,,fgets(),,,fputs(),,一次操作一行,格式化输入输出:可以指定输入输出的具体格式,,printf,、,fprintf,,,sprintf,,,scanf,,,fscanf,,,sscanf,,,37,xx,38,2025/12
27、/18 周四,文件操作,标准,I/O,函数的缓冲效果,例子:全缓冲(,1024,字节缓冲区),#include,#include,int main(),int i=0;,for(i=0;i260;i+)/,每次向缓冲区内写,4,个字符,/*printf(%03dn,i);*/,fprintf(stdout,%03d,i);,/*fflush(stdout);*/,/*sleep(1);*/,while(1);/,避免程序结束,等待缓冲区填充。,38,应用编程基础,应用程序编译,文件操作,进程操作,进程间通信,39,进程操作,Linux,进程,“,Everything in Unix is a
28、file.Everything in Unix that is not a file is a process,”,进程,程序的一个运行实例,一个程序可以同时有多个运行实例,与进程相关的数据,:,打开的文件,分配的内存,进程,ID,父进程,ID,,优先级,状态,进程相互独立,并发执行,.,进程由操作系统调度。,Linux,用,task,数据结构来管理进程,其中包含了描述进程的,PID,PPID,等数据。,40,进程操作,Linux,进程,进程封装了一个程序以及与其相关的所有资源。,每个进程程序有自己的进入点,main(),函数,每个进程有自己的虚拟内存空间,与其他进程内存空间隔离。,例:显示当
29、前所有的用户进程,$ps-ef,例:显示当前终端上运行的进程,%ps,PID TTY TIME CMD,21693 pts/8 00:00:00 bash,21694 pts/8 00:00:00 ps,41,进程操作,Linux,进程,显示进程自己,ID,和父进程,ID,#include,#include,int main(),printf(“The process ID is%dn”,(int)getpid();,printf(“The parent process ID is%dn”,(int)getppid();,return 0;,42,进程操作,并行执行的进程,/audio_vid
30、eo.c,int main(int argc,char*argv),while(condition=TRUE),callAudioFxn();,callVideoFxn();,/audio.c,handles audio only,int main(int argc,char*argv),while(condition=TRUE),callAudioFxn();,方法,1,:在一个进程中处理音频和视频,/video.c,handles video only,int main(int argc,char*argv),while(condition=TRUE),callVideoFxn();,方法
31、2,:在不同进程中分别处理音频和视频,分开两个进程的好处:,不同的处理速率,不同的优先级,可能需要多个音频,/,视频通道(模块化),需要各自内存保护,43,进程操作,在终端中观察进程,ps ux,列出属于当前用户的所有进程,ps aux,列出运行在系统上的所有进程,ps-aux,USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND,bart 3039 0.0 0.2 5916 1380 pts/2 S 14:35 0:00/bin/bash,bart 3134 0.0 0.2 5388 1380 pts/3 S 14:36 0:00/bin
32、/bash,bart 3190 0.0 0.2 6368 1360 pts/4 S 14:37 0:00/bin/bash,bart 3416 0.0 0.0 0 0 pts/2 R 15:07 0:00 bash.,PID:Process id,VSZ:Virtual process size(code+data+stack),RSS:Process resident size:number of KB currently in RAM,TTY:Terminal,STAT:Status:,R(Runnable),S(Sleep),D(Uninterrupted sleep),Z(Zombie
33、),T(Traced),44,进程操作,管理背景任务进程,启动任务在背景运行,./sleep 30&,显示同一个,shell,里面背景任务,jobs-l,1-sleep 30&,把最后一个,/,第,n,个背景任务放到前台运行,fg,fg%n,把当前任务放到背景去运行,Ctrl-Z,bg,中止第,n,个任务,kill%n,45,xx,46,2025/12/18 周四,进程操作,/proc,虚拟文件系统,该目录下的虚拟文件给出系统和进程相关信息,/proc/version,操作系统版本,/proc/cpuinfo,处理器信息,/proc/,进程,ID,目录下为该进程信息,cmdline,命令行,c
34、wd,当前目录,environ,环境变量,fd/,子目录,打开的文件描述符,maps,映射到进程地址空间的文件,程序,库文件,,ets,exe,可执行映像的符号连接,.,46,进程操作,在程序中建立新进程,系统中所有进程都是从一个原始进程分裂出来,这个原始进程是启动时建立的。,当使用,fork,系统调用时,两个进程执行相同的代码。,可以检测谁是新进程并让它执行另外一个程序(调用,exec,),将一个执行的进程分裂为两个相同的环境,新进程替代老进程但维持以前的环境,启动新进程同时保留老进程,fork,exec,fork+exec,47,进程操作,在,C,程序中复制进程,调用系统调用函数,fork
35、建立一个新进程,.,Fork,建立的子进程克隆了父进程的数据和环境,当从,fork,返回时,两个进程运行相同的程序,程序如何知道处在哪一个进程中?,对于父进程,,Fork,会返回子进程的,PID,,对于子进程,,fork,返回,0,。,#include,#include,pid_t fork(void);,48,进程操作,在,C,程序中复制进程,Which is which?,pid_t new_pid;,new_pid=fork();,switch(new_pid),case-1:/*Error*/,break;,case 0:/*Its child*/,break;,default:/*
36、Its parent*/,break;,49,进程操作,等待进程结束,int main(),pid_t pid;,int status;,pid=fork();,switch(pid),case-1:,pprintf(fork failed);,exit(1);,case 0:,printf(Im the child!n);,exit(0);,default:,printf(Im the parent!n);,wait,(,if(WIFEXITED(status),printf(Child exist with status of%dn,WEXITSTATUS(status);,exit(0)
37、include,#include,#include,#include,#include,50,进程操作,建立进程执行新程序,pid_t pid;,if(pid=fork(),int status;,printf(Im the parent!n);,wait(,else,printf(Im the child!n);,execve,(“/bin/ls”,argv,envp);,此调用将会用存储在指定路径中的程序替换内存中的程序映像,(,代码和数据,),。,先前打开的文件描述符,优先级和其他属性保持不变。,51,进程操作,执行新程序例子,#include,#include,#include,
38、include,int main(),/*,传递给“,ls”,命令的参数列表*,/,char*arg_list=,ls,-l,/,NULL;,spawn(ls,arg_list);,printf(done with main programn);,return 0;,52,xx,53,2025/12/18 周四,进程操作,执行新程序例子,#include,#include,#include,#include,int main(),/*,传递给“,ls”,命令的参数列表*,/,char*arg_list=,ls,-l,/,NULL;,spawn(ls,arg_list);,printf(don
39、e with main programn);,return 0;,int spawn(char*program,char*arg_list),pid_t child_pid;,/*,复制一个进程*,/,child_pid=fork();,if(child_pid!=0)/*,这是父进程,返回,.*/,sleep(30);/*,父进程结束前可观察僵尸子进程*,/,return child_pid;,else /*,子进程,执行程序,ls.*/,execvp(program,arg_list);,/*execvp,函数只有出错时才返回*,/,fprintf(stderr,An error occu
40、rredn);,abort();,53,进程操作,exec,函数族,用来替换当前进程执行的程序,不同的变种,启动进程和传递参数的方式有差别。,以,p,结尾的形式在环境变量,PATH,中搜索程序的位置,以,e,结尾的形式可传递自定义的环境变量,#include,char*environ;,int execl(const char*path,const char*arg0,.,(char*)0);,int execlp(const char*file,const char*arg0,.,(char*)0);,int execle(const char*path,const char*arg0,.,
41、char*)0,char*const envp);,int execv(const char*path,char*const argv);,int execvp(const char*file,char*const argv);,int execve(const char*path,char*const argv,char*const envp);,54,xx,55,2025/12/18 周四,进程操作,exec,函数族,#include,/*Example of an argument list*/,/*Note that we need a program name for argv0*
42、/,char*const ps_argv=“ps”,“ax”,0;,/*Example environment,not terribly useful*/,char*const ps_envp=“PATH=/bin:/usr/bin”,“TERM=console”,0;,/*Possible calls to exec functions*/,execl(“/bin/ps”,“ps”,“ax”,0);/*assumes ps is in/bin*/,execlp(“ps”,“ps”,“ax”,0);/*assumes/bin is in PATH*/,execle(“/bin/ps”,“ps”
43、ax”,0,ps_envp);/*passes own environment*/,execv(“/bin/ps”,ps_argv);,execvp(“ps”,ps_argv);,execve(“/bin/ps”,ps_argv,ps_envp);,55,xx,56,2025/12/18 周四,进程操作,进程退出,发生下列情况之一进程退出,:,从,main,函数返回,.,调用了,exit(),函数,.,发生异常,.,进程应该为其父进程返回退出状态。,退出时,:,所有退出处理函数都会被调用,(,用,atexit(),注册这些函数,),所有内存,文件描述符和其他资源都被系统释放。,56,应用编
44、程基础,应用程序编译,文件操作,进程操作,进程间通信,57,xx,58,2025/12/18 周四,进程间通信,进程间通信,多任务编程的重要手段,实现功能:,进程间数据交换,任务间同步,对共享资源访问的保护,Linux,下的进程通信手段基本上是从,Unix,平台上的进程通信手段继承而来的。,最初,UNIX,进程间通信,SystemV,进程间通信,Socket,进程间通信,POSIX,进程间通信,Linux,进程间通信,58,xx,59,2025/12/18 周四,进程间通信,常用的进程间通信方式,管道(,Pipe,)及有名管道(,named pipe,,,FIFO,):,管道可用于具有亲缘关系
45、进程间的通信,有名管道除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。,信号(,Signal,),信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。,消息队列(,Messge Queue,),消息队列是消息的链接表,包括,Posix,消息队列,SystemV,消息队列。它克服了前两种通信方式中信息量有限的缺点。,59,xx,60,2025/12/18 周四,进程间通信,常用的进程间通信方式,共享内存(,Shared memory,),最有效的进程间通信方式。它使得多个进程可以访问
46、同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。,这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。,信号量(,Semaphore,),作为进程之间、同一进程的不同线程之间的同步和互斥手段。,套接字(,Socket,),更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。,60,应用编程基础,练习,1,编写简单,Hello World,程序,打印字符串。调用,gcc,编译,执行。,2,参考,dvar.c,程序,编译执行,观察内存变量在虚拟地址空间分布。观察程序打印输出和,/proc/pid/maps,给出的数据。,61,应用编程基础,练习,
47、3,(,1,)编写一个计算,5+(9/3),的程序,要求分成,4,个文件,一个头文件,myhead.h,,一个进行加法运算的,myadd.c,代码文件、一个进行除法的文件,mydiv.c,和一个调用加法和除法函数的,result.c,文件,在其中打印计算结果。,(,2,)编写一个,Makefile,,使它们在,make,工具下生成可执行文件,myresult,。同时,还有一个,make,目标,clean,可以清除所有编译中间结果和可执行文件。,(,3,)整个项目文件都放在,一个目录,cal,下面。,62,CCS编程和调试,练习结果提交,将以上要求的第,3,个练习的,cal,目录压缩成一个文档,tar zcvf,ex2-n.tar.gz,cal,其中,n,是小组编号,将这个压缩文档提交到指定邮箱,ywen,63,xx,64,2025/12/18 周四,应用编程基础,参考,Mark,Mitchell,Advanced.Linux.Programming,Neil,Matthew,Beginning Linux Programming,4th Edition,64,65,






