《Linux编程简介》PPT课件.ppt

上传人:za****8 文档编号:13190673 上传时间:2020-06-07 格式:PPT 页数:83 大小:925.01KB
返回 下载 相关 举报
《Linux编程简介》PPT课件.ppt_第1页
第1页 / 共83页
《Linux编程简介》PPT课件.ppt_第2页
第2页 / 共83页
《Linux编程简介》PPT课件.ppt_第3页
第3页 / 共83页
点击查看更多>>
资源描述
ARM应用系统设计第7章Linux编程简介,佘黎煌东北大学信息科学与工程学院电子信息工程研究所,现在Linux广泛用于各类计算应用,不仅包括IBM的微型Linux腕表、手持设备(PDA和蜂窝电话)、因特网装置、瘦客户机、防火墙、工业机器人和电话基础设施设备,甚至还包括了基于集群的超级计算机。,嵌入式Linux概况,Linux操作系统开放源代码,可以裁剪内核,并已在x86、Alpha、Sparc、MIPS、PPC、Motorola、NEC和ARM等硬件平台上稳定、高效地运行。Linux操作系统作为一种多任务、稳定可靠、内核可裁剪的系统,是开发嵌入式软硬件产品的优秀软件平台。嵌入式Linux是一种开放源码、软实时、多任务的嵌入式操作系统。,嵌入式Linux概况,Linux入门需要掌握的内容,Linux环境的使用会使用VI编辑器掌握一些基本的命令Linux编程需要掌握的内容GNUGCC编译工具进程文件操作信号处理消息管理线程操作网络编程,Linux操作系统界面,在Linux系统中打开终端的方式有以下两种:种是在桌面上依次单击“主程序系统工具终端”可打开如图2-1的终端窗口;另一种是在Linux桌面上单击鼠标右键,从弹出的快捷菜单中选择“终端”命令,也可打开终端窗口。,Linux入门需要掌握的内容,GNUGCC编译工具进程文件操作信号处理消息管理线程操作网络编程,Linux下C代码的编译,开发工具GNU的介绍GNU软件包括C编译器GCC,C+编译器G+,汇编器AS,链接器LD,二进制转换工具(OBJCOPY,OBJDUMP),调试工具(GDB,GDBSERVER,KGDB)和基于不同硬件平台的开发库。在GNUGCC支持下用户可以使用流行的C/C+语言开发应用程序,满足生成高效率运行代码的需求,Linux下C代码的编译,/*FileName:hello.c*Description:introducehowtocompileasourcefilewithgcc*#includevoidmain()printf(Helloworldn);$gcc-ohellohello.c,Linux下C代码的编译,GCC是一个多目标的工具。GCC最基本的用法是:gccoptionsfile.,其中的option是以“-”开始的各种选项,file是相关的文件名。在使用GCC的时候,必须要给出必要的选项和文件名。GCC的整个编译过程,实质上是分4步进行的,每一步完成一个特定的工作,这4步分别是:预处理、编译、汇编和链接。它具体完成哪一步,是由GCC后面的开关选项和文件类型决定的。,Linux下C代码的编译,GCC编译器有许多选项,但对于普通用户来说只要知道其中常用的几个就够了。在这里列出几个最常用的选项。-o选项表示要求编译器生成指定文件名的可执行文件。-c选项表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由.c或.cc变成.o的目标文件。-g选项要求编译器在编译的时候提供以后对程序进行调试的信息。-E选项表示编译器对源文件只进行预处理就停止,而不做编译、汇编和链接。-S选项表示编译器只进行编译,而不做汇编和链接。-O选项是编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高。-Wall选项指定产生全部的警告信息。gcc-Wall-O-g-cmain.c-omain.o,Linux下C代码的编译,GNUMake是负责从项目的源代码中生成最终可执行文件和其他非源代码文件的工具。$make-fmakefilenamemakefile的例子。executable:main.oio.ogccmain.oio.o-oexecutablemain.o:main.cgcc-Wall-O-g-cmain.c-omain.oio.o:io.cgcc-Wall-O-g-cio.c-oio.o第一行称之为规则,第二行是执行规则的命令,必须要以tab键开始,Linux下C代码的编译,executable:main.oio.ogccmain.oio.o-oexecutablemain.o:main.cgcc-Wall-O-g-cmain.c-omain.oio.o:io.cgcc-Wall-O-g-cio.c-oio.o1.executable是makefile最终要生成的目标文件。给出的规则说明executable依赖于两个目标文件main.o和io.o,只要executable比它依赖的文件中的任何一个旧的话,下一行的命令就会被执行。2.但是,在检查文件main.o和io.o的日期之前,它会往下查找那些把main.o或io.o做为目标文件的规则。Make先找到了关于main.o的规则,该目标文件的依赖文件是main.c。3.makefile后面的文件中再也找不到生成这个依赖文件的规则了。此时,Make开始检查磁盘上这个依赖文件的日期,如果这个文件的日期比main.o日期新的话,那么这个规则下面的命令gcc-Wall-cmain.c-omain.o就会执行,,Linux下C代码的编译,Makefile宏定义OBJS=main.oio.oCC=gccCFLAGS=-Wall-O-gexecutable:$(OBJS)$(CC)$(OBJS)-oexecutablemain.o:main.c$(CC)$(CFLAGS)-cmain.c-omain.oio.o:io.c$(CC)$(CFLAGS)-cio.c-oio.o在这个makefile中引入了三个宏定义,所以如果这些宏中的某些值发生变化,开发者只需在要修改的宏处,将其宏值修改为要求的值即可,。在make中还有一些已经定义好的内部变量,几个较常用的变量是$、$、$?、$*和$。$扩展为当前规则的目标文件名。$扩展为当前规则依赖文件列表中的第一个依赖文件。$?扩展为所有的修改日期比当前规则的目标文件的创建日期更晚的依赖文件,该值只有在使用显式规则时才会被使用。$*扩展成当前规则中目标文件和依赖文件共享的文件名,不含扩展名。$扩展为整个依赖文件的列表(除去了所有重复的文件名)。,OBJS=main.oio.oCC=gccCFLAGS=-Wall-O-gexecutable:$(OBJS)$(CC)$-o$main.o:main.c$(CC)$(CFLAGS)c$-o$io.o:io.c$(CC)$(CFLAGS)-c$-o$,Makefile示例,编写该程序的编译脚本Makefile,Makefile示例,文件名Makefile:main:main.omytool1.omytool2.ogccomainmain.omytool1.omytool2.omain.o:main.cmytool1.hmytool2.hgcccmain.cmytool1.o:mytool1.cmytool1.hgcccmytool1.cmytool2.o:mytool2.cmytool2.hgcccmytool2.c,Makefile示例,main:main.omytool1.omytool2.ogcco$main.o:main.cmytool1.hmytool2.hgccc$mytool1.o:mytool1.cmytool1.hgccc$mytool2.o:mytool2.cmytool2.hgccc$,Linux入门需要掌握的内容,GNUGCC编译工具进程文件操作信号处理消息管理线程操作网络编程,进程,通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件,而进程是一个开始执行但没有结束的程序的实例,就是可执行文件的具体实现,一个程序可能有许多进程,而一个进程又可以有许多线程,依次循环下去,而产生子孙线程.为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别每个进程分为新建,运行,阻塞,就绪和完成五个状态,进程,进程都有一个ID,系统可通过调用getpid得到进程的ID,而getppid可以得到父进程的ID#includepid_tgetpid(void);pid_tgetppid(void);,进程的创建,1.使用fork()函数,就象进程克隆(clone)自己一样,创建两个一模一样的进程是没有,通过fork的返回值来区分父进程和子进程,错误返回-1,对于父进程返回子进程的ID,对于子进程返回0.voidmain()inti;if(child=fork()=-1)printf(“Forkerrorn”);exit(1);elseif(fork()=0)/*子进程程序*/for(i=1;i5;i+)printf(Thisischildprocessn);exit(1)else/*父进程程序*/for(i=1;i);fgets(command,256,stdin);commandstrlen(command)-1=0;if(fork()=0)/*子进程执行此命令*/execlp(command,command);/*如果exec函数返回,表明没有正常执行命令,打印错误信息*/perror(command);exit(errorno);else/*父进程,等待子进程结束,并打印子进程的返回值*/wait(,Linux入门需要掌握的内容,GNUGCC编译工具进程文件操作信号处理消息管理线程操作网络编程,Linux下文件操作,文件I/O函数-打开文件、读文件、写文件等等。大多数UNIX文件I/O只需用到5个函数:open、read、write、lseek以及close。open函数#include#include#includeintopen(constchar*pathname,intoflag,./*,mode_tmode*/);,Linux下文件操作,pathname是要打开或创建的文件的名字。oflag参数可用来说明此函数的多个选择项。用下列一个或多个常数进行或运算构成oflag参数(这些常数定义在头文件中):O_RDONLY只读打开。O_WRONLY只写打开。O_RDWR读、写打开。在这三个常数中应当只指定一个。下列常数则是可选择的:O_APPEND每次写时都加到文件的尾端。O_CREAT若此文件不存在则创建它。O_EXCL如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。O_TRUNC如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。,intcreat(constchar*pathname,mode_tmode);以mode方式创建一个以pathname为文件名的文件,返回新的文件句柄fd,错误返回-1及错误代码errno。,size_tread(intfd,void*buf,size_tcount);把fd指向的文件传送count字节到buf指针所指向的内存中,正确返回实际写入的字节数,错误返回-1及错误代码errno。,Linux下文件操作,size_twrite(intfd,void*buf,size_tcount);把buf指针指向的内存count字节传送到fd指向的文件中,正确返回读到的字节数或0,错误返回-1及代码errno。,off_tlseek(intfd,off_toffset,intwhere);将fd所指文件的读写指针在where位置移动offset个位移量intclose(intfd);关闭fd所指文件,顺利关闭返回0,错误返回-1。程序框图。,Linux下文件操作,Linux下文件操作,#include#include#include#includeintmain()charc;intin,out;in=open(“file.in”,O_RDONLY);out=open(“file.out”,O_WRONLY|O_CREAT);while(read(in,Linux入门需要掌握的内容,GNUGCC编译工具进程文件操作信号处理消息管理线程操作网络编程,捕捉SIGUSR1和SIGUSR2处理程序,信号是软件中断。很多比较重要的应用程序都需处理信号。信号提供了一种处理异步事件的方法首先,每个信号都有一个名字。这些名字都以三个字符SIG开头。例如,SIGABRT是夭折信号,当进程调用abort函数时产生这种信号。SIGALRM是闹钟信号,当由alarm函数设置的时间已经超过后产生此信号。在头文件中,这些信号都被定义为正整数(信号编号),Linux系统信号,捕捉SIGUSR1和SIGUSR2处理程序,信号机制最简单的界面是signal函数。#includevoid(*signal(intsigno,void(*func)(int)(int);当指定函数地址时,我们称此为捕捉此信号。我们称此函数为信号处理程序(signalhandler)或信号捕捉函数(signal-catchingfunction),捕捉SIGUSR1和SIGUSR2处理程序,$a.outftok函数是根据pathname和proj来创建一个关键字.intmsgget(key_tkey,intmsgflg);intmsgsnd(intmsgid,structmsgbuf*msgp,intmsgsz,intmsgflg);intmsgrcv(intmsgid,structmsgbuf*msgp,intmsgsz,longmsgtype,intmsgflg);structmsgbuflongmsgtype;/*消息类型*/./*其他数据类型*/,创建消息队列,发送消息,接收消息,消息数据结构,进程1,服务器进程,#defineMSG_FILEserver.c#defineBUFFER255#definePERMS_IRUSR|S_IWUSRstructmsgtypelongmtype;charbufferBUFFER+1;,进程1,服务器进程,创建消息队列intmain()structmsgtypemsg;key_tkey;intmsgid;if(key=ftok(MSG_FILE,a)=-1)fprintf(stderr,CreatKeyError:%san,strerror(errno);exit(1);if(msgid=msgget(key,PERM|IPC_CREAT|IPC_EXCL)=-1)fprintf(stderr,CreatMessageError:%san,strerror(errno);exit(1);,进程1,服务器进程,接收和发送消息while(1)msgrcv(msgid,进程2,客户端进程,#defineMSG_FILEserver.c#defineBUFFER255#definePERMS_IRUSR|S_IWUSRstructmsgtypelongmtype;charbufferBUFFER+1;,进程2,客户端进程,获取服务器创建的消息intmain(intargc,char*argv)structmsgtypemsg;key_tkey;intmsgid;if(argc!=2)fprintf(stderr,Usage:%sstringna,argv0);exit(1);if(key=ftok(MSG_FILE,a)=-1)fprintf(stderr,CreatKeyError:%san,strerror(errno);exit(1);if(msgid=msgget(key,PERM)=-1)fprintf(stderr,CreatMessageError:%san,strerror(errno);exit(1);,进程2,客户端进程,发送和接收消息msg.mtype=1;strncpy(msg.buffer,argv1,BUFFER);msgsnd(msgid,Linux入门需要掌握的内容,GNUGCC编译工具进程文件操作信号处理消息管理线程操作网络编程,Linux入门需要掌握的内容,GNUGCC编译工具进程文件操作信号处理消息管理线程操作网络编程,“节俭”的多任务操作方式,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段。运行一个进程中的多个线程,彼此之间使用相同的地址空间、共享大部分数据、启动一个线程所花费的空间远远小于启动一个进程所花费的空间。线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。,线程特点,对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式费时而不方便。由于同一进程下的线程之间共享数据空间,它们共享全局变量、共享进程指令、大多数数据和打开的文件(如描述字)、信号处理程序和信号处置、当前工作目录、用户ID和组ID,一个线程的数据可以直接为其他线程所用,快捷方便。,线程间方便的通信机制,线程特点,线程的基本操作函数,先讲述4个基本线程函数,在调用它们前均要包括pthread.h头文件1.创建线程函数2.等待线程的结束函数3.取自己线程ID函数4.终止线程函数,创建线程函数,intpthread_create(pthread_t*tid,constpthread_attr_t*attr,void*(*func)(void*),void*arg);,线程的基本操作函数,注意:第一个参数为指向线程标识符的指针第二个参数用来设置线程属性第三个参数是线程运行函数的起始地址最后一个参数是运行函数的参数,等待线程的结束函数,Intpthread_join(pthread_ttid,void*status);第一个参数为被等待的线程标识符第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值,线程的基本操作函数,这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。,取自己线程ID函数,pthread_self(void);线程都有一个ID在给定的进程内标识自己。线程ID由pthread_creat返回,可以取得自己的线程ID。,线程的基本操作函数,一个线程的结束有两种途径,一种是函数结束,调用它的线程也就结束,另一种方式是通过函数pthread_exit来实现。voidpthread_exit(void*status);唯一的参数是函数的返回代码,注:一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。,线程的基本操作函数,终止线程函数,简单的多线程编程,Linux系统下的多线程遵循POSIX线程接口,称为pthread编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.aLinux下pthread的实现是通过系统调用clone()来实现的。,简介,举例,#include#includevoidthread(void)inti;for(i=0;ih_addr);/*将结构剩下的部分清零*/bzero(,$telnetremotehostname4000解析参数中的IP地址,创建客户端套接字,客户端,if(connect(sockfd,(structsockaddr*),向服务器发送连接请求,接收服务器发送的数据,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!