应用程序设计_第1页
应用程序设计_第2页
应用程序设计_第3页
应用程序设计_第4页
应用程序设计_第5页
已阅读5页,还剩155页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,嵌入式操作系统,适用专业:物联网工程任课教师:兰方鹏联系方式-mail:lfp424QQ:275392011,TaiyuanUniversityofTechnology,太原理工大学计算机科学与技术学院,2,Linux应用程序设计,Linux文件编程Linux进程控制Linux进程通信Linux管道通信Linux信号通信Linux共享内存Linux消息队列Linux信号量Linux多线程机制Linux网络编程,3,Linux文件编程,Linux文件编程有两种方法:,Linux系统调用C的库函数,其中前者依赖于Linux系统,后者与操作系统是独立的,在任何操作系统中,使用C的库函数操作文件的方法都是相同的。,4,系统调用的创建,系统调用函数:,intcreat(constchar*filename,mode_tmode),filename:要创建的文件名(包含路径,缺省为当前路径)mode:创建模式,S_IRUSR/可读S_IWUSR/可写S_IXUSR/可执行S_IRWXU/可读、写、执行,5,系统调用-创建文件,除了可以使用上述宏定义以外,还可以直接使用数字来表示文件的访问权限,可执行1可写2可读4可读可写6无任何权限0,思考:访问权限为7?3?5?,例7.1:file_creat.c,6,文件描述,在Linux系统中,所有打开的文件都对应一个文件描述符。文件描述符的本质是一个非负整数。当打开一个文件时,该整数由系统来分配。文件描述符的范围是0-OPEN_MAX。早期的UNIX版本OPEN_MAX=19,即允许每个进程同时打开20个文件,现在很多系统则将其增加至1024。,7,系统调用-打开文件,系统调用函数:,intopen(constchar*pathname,intflags)intopen(constchar*pathname,intflags,mode_tmode),filename:要打开的文件名(包含路径,缺省为当前路径)flags:打开标记,O_RDONLY/只读方式打开O_WRONLY/只写方式打开O_RDWR/读写方式打开O_APPEND/追加方式打开O_CREAT/创建一个文件O_NOBLOCK/非阻塞方式打开,8,系统调用-打开文件,系统调用函数:,intopen(constchar*pathname,intflags,mode_tmode),如果flags标记中使用了O_CREAT标记,则需指定mode参数,例7.2:file_open.c,mode:表示文件的访问权限,9,系统调用-关闭文件,当我们操作完文件以后,需要关闭文件:,intclose(intfd),fd:文件描述符,fd的来源?,10,系统调用-读文件,系统调用函数:,intread(intfd,constvoid*buf,size_tlength),功能描述:从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。,11,系统调用-写文件,系统调用函数:,intwrite(intfd,constvoid*buf,size_tlength),功能描述:把length个字节从buf所指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。,12,系统调用-定位,intlseek(intfd,offset_toffset,intwhence),功能描述:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。参数whence,SEEK_SET/相对文件开头SEEK_CUR/相对文件读写指针的当前位置SEEK_END/相对文件末尾,13,系统调用-定位,intlseek(intfd,offset_toffset,intwhence),举例:计算文件长度,参数offset,offset可取正值,表示向后移动;取负值,表示向前移动,lseek(fd,-5,SEEK_CUR),lseek(fd,0,SEEK_END),14,系统调用-访问判断,intaccess(constchar*pathname,intmode),pathname:文件名称mode:访问权限,功能描述:判断文件的访问权限(读、写、执行等),R_OK/文件可读W_OK/文件可写X_OK/文件可执行F_OK/文件存在,返回值:,0/条件符合-1/条件不符合,15,系统调用-访问判断,intaccess(constchar*pathname,intmode),#includeintmain()if(access(“/etc/passwd”,R_OK)=0)printf(“/etc/passwdcanberead!n”);,例如:,16,库函数,Linux文件编程有两种方法:,Linux系统调用C的库函数,C的库函数的文件操作是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux还是VxWorks中都是这些函数。,17,库函数-创建和打开,C的库函数:,FILE*fopen(constchar*pathname,constchar*mode),filename:要打开的文件名(包含路径,缺省为当前路径)mode:打开模式,r,rb/只读方式打开w,wb/只写方式打开,若文件不存在,则创建该文件a,ab/追加方式打开,若文件不存在,则创建该文件r+,r+b,rb+/读写方式打开w+,w+b,wb+/读写方式打开,若文件不存在,则创建该文件a+,a+b,ab+/读和追加方式打开,若文件不存在,则创建该文件,b用于区分二进制和文本文件,但是Linux系统不区分二者,18,库函数-读文件,C的函数:,size_tfread(void*ptr,size_tsize,size_tn,FILE*stream),功能描述:从stream所指向的文件中读取n个字段,每个字段为size个字节,并将读取的数据放入ptr所指向的字符数组中,返回实际已读取的字节数。,19,库函数-写文件,C的函数:,size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream),功能描述:从缓冲区ptr所指向的数组中把n个字段写入stream所指向的文件中,每个字段的长度为size个字节,返回实际写入的字节数。,20,库函数-读字符,从指定的文件中读一个字符:,intfgetc(FILE*stream),#includemain()FILE*fp;charch;if(fp=fopen(c1.txt,r)=NULL)printf(nCannotopenfilestrikeanykeyexit!);getch();exit(1);ch=fgetc(fp);while(ch!=EOF)putchar(ch);ch=fgetc(fp);fclose(fp);,21,库函数-写字符,从指定的文件中写入一个字符:,intfputc(intc,FILE*stream),#includemain()FILE*fp;charch;if(fp=fopen(string,w+)=NULL)printf(Cannotopenfile,strikeanykeyexit!);getch();exit(1);printf(inputastring:n);ch=getchar();while(ch!=n)fputc(ch,fp);ch=getchar();printf(n);fclose(fp);,22,库函数-格式化读,从一个流中进行格式化输入:,fscanf(FILE*stream,char*format,argument),#include#includeintmain(void)inti;printf(Inputaninteger:);if(fscanf(stdin,%d,23,库函数-格式化写,格式化输出到一个流中:,intfprintf(FILE*stream,char*format,argument),#include#includeFILE*stream;voidmain(void)inti=10;doublefp=1.5;chars=thisisastring;charc=n;stream=fopen(fprintf.out,w);fprintf(stream,%s%c,s,c);fprintf(stream,%dn,i);fprintf(stream,%fn,fp);fclose(stream);,24,库函数-定位,C库的定位函数:,intfseek(FILE*stream,char*format,argument),25,库函数-定位,intfseek(FILE*stream,longoffset,intwhence),参数whence,SEEK_SET/从文件的开头处开始搜索SEEK_CUR/从当前位置开始搜索SEEK_END/从文件末尾开始搜索,26,库函数-路径获取,char*getcwd(char*buffer,size_tsize),getcwd函数把当前的路径名copy到buffer中,buffer的大小为size,如果buffer太小,函数会返回-1。,27,库函数,思考题:利用C的库函数实现文件的拷贝,例7.2:file_cp.c,28,Linux应用程序设计,Linux文件编程Linux进程控制Linux进程通信Linux管道通信Linux信号通信Linux共享内存Linux消息队列Linux信号量Linux多线程机制Linux网络编程,29,Linux进程控制-理论篇,进程是一个具有一定独立功能的程序的一次运行活动。进程的特点:,动态性并发性独立性异步性,30,Linux进程控制-理论篇,进程的状态,31,Linux进程控制-理论篇,进程ID,进程ID(PID):标识进程的唯一数字父进程的ID(PPID)启动进程的用户ID(UID),进程互斥,进程互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。,32,Linux进程控制-理论篇,临界资源,临界区,进程中访问临界资源的那段程序代码称为临界区。为实现对临界资源的互斥访问,应保证诸进程互斥地进入各自的临界区。,操作系统中将一次只允许一个进程访问的资源称为临界资源。,33,Linux进程控制-理论篇,进程调度:,按照一定的算法,从就绪队列中选择一个进程来占有CPU,一组并发进程按一定的顺序执行的过程称为进程间的同步具有同步关系的一组并发进程称为合作进程合作进程间互相发送的信号称为消息或事件。,调度方式:,抢占式非抢占式,34,Linux进程控制-理论篇,调度算法:,调度死锁:,先来先服务短进程优先高优先级优先时间片轮转,多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进。,35,Linux进程控制-进程编程,获取本进程ID:,pid_tgetpid(void),获取父进程ID:,pid_tgetppid(void),36,Linux进程控制-进程编程,例:getpid.c,#include#include#includeintmain(void)printf(PID=%dn,getpid();printf(PPID=%dn,getppid();return0;,37,子进程创建-fork,例fork.c:,#include#include#includemain()pid_tpid;pid=fork();if(pid0”);,输出结果:pid=0pid0,38,#includepid_tfork(),fork创建子进程,fork创建进程的过程:fork被调用一次,却返回两次,它可能有三种不同的返回值。,在父进程中,fork返回新创建的子进程的PID在子进程中,fork返回0如果出现错误,fork返回一个负值,子进程创建-fork(),39,子进程创建-子进程与父进程,fork()函数的调用使得进程数目发生了变化,父子进程的区别在于进程标识符(PID)不同。,父进程与子进程:,父进程:原来存在的那个进程称作“父进程”,子进程:新出现的那个进程称作“子进程”,40,子进程创建-fork,fork1.c,#include#include#includemain()pid_tpid;pid=fork();if(pid0)/父进程pr=wait(NULL);/等到子进程退出,父进程才会运行printf(Iamthefather:%dn,getpid();exit(0);,思考:改为vfork()可以吗?,56,Linux应用程序设计,Linux文件编程Linux进程控制Linux进程通信Linux管道通信Linux信号通信Linux共享内存Linux消息队列Linux信号量Linux多线程机制Linux网络编程,57,进程通信,进程通信概述,数据传输两个进程之间需要互相传输数据,资源共享多个进程之间需要共享同样的资源,通知事件一个进程需要向另外一个或一组进程发送消息,通知它们发生了某个事件。,进程控制控制进程希望拦截另一个进程的所有操作,并通知及时通知它的状态改变,58,Linux应用程序设计,Linux文件编程Linux进程控制Linux进程通信Linux管道通信Linux信号通信Linux共享内存Linux消息队列Linux信号量Linux多线程机制Linux网络编程,59,进程通信,Linux使用的进程通信方式主要有:,管道(pipe)和命名管道(FIFO)信号(signal)消息队列共享内存信号量套接字(socket),60,管道通信,管道分为命名管道和无名管道,无名管道用于父进程和子进程之间的通信命名管道用于同一系统中的任意两个进程间的通信,61,无名管道,无名管道:,只能用于具有血缘关系的进程之间的通信(也就是父子进程或兄弟进程之间)。,无名管道又被称为pipe,是Linux中进程通信的一种方式,它是半双工通信模式,具有固定的读写端。,它是一种特殊的文件,只存在于内核的内存空间中,可以通过read、write等函数对其操作。,62,无名管道通信,无名管道的特点,管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。,63,无名管道的特点,数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。,无名管道通信,64,无名管道的创建,管道是基于文件描述符的通信方式,当建立一个管道时,会创建两个文件描述符fd0和fd1,其中fd0用于读管道,fd1用于写管道,管道创建是调用pipe(intfd2)函数,管道关闭是调用close()函数逐个关闭各个文件描述符,无名管道通信-创建管道,65,pipe()函数原型,#includeintpipe(intfd2),参数fd2:管道的两个文件描述符,fd0读数据,fd1写数据函数返回值:成功:0失败:-1,无名管道通信-创建管道,66,创建管道:#include#includeintmain()intfd2;if(pipe(fd)0)/父进程close(fd0);/父进程关闭管道的读端写数据waitpid(pid,NULL,0);/等待子进程结束exit(0);close(fd0);close(fd1);,无名管道通信-fork创建管道,70,管道通信,管道通信实例:pipe_rw.c,71,无名管道应用举例,Linux命令回顾:,#ls|more,功能:将ls命令的输出作为more命令的输入,并显示more的最终输出。,stdin:标准输入,代码为0stdout:标准输出,代码为1stderr:标准的错误输出,代码为2,72,#ls|more#ls|less,无名管道应用举例,管道连接,ls,stdin,stderr,moreless,stdout,stderr,stdout,stdin,fd1,fd0,73,execv函数,#includeintexecv(constchar*path,char*constargv),path:被执行程序名(含完整路径),argv:被执行程序所需要的命令行参数数组,execv启动一个新的进程,替换原有的进程。,74,文件描述符的复制,文件描述符的复制intdup2(intfile1,intfile2),把file1文件描述符复制file2,使得file1和file2指向同一个文件,75,intmain()intfd2;char*argv1=ls,-al,/etc,(char*)0;char*argv2=less,(char*)0;if(pipe(fd)/tmp/b.txt,79,作业2提示:,#grepabc/home/sn.txt/tmp/b.txt,80,Linux应用程序设计,Linux文件编程Linux进程控制Linux进程通信Linux管道通信Linux信号通信Linux共享内存Linux消息队列Linux信号量Linux多线程机制Linux网络编程,81,信号通信,信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号,当用户按下某些键时,产生信号硬件异常产生信号进程用kill函数将信号发送给另外一个进程用户利用kill命令将信号发送给其他进程,例如:除数为0、无效的存储访问等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号。,82,信号通信,83,信号通信,常见的几种信号类型:,SIGHUP:从终端上发出的结束信号SIGINT:来自键盘的中断信号(Ctrl+C)SIGKILL:该信号结束接收信号的进程SIGTERM:kill命令发出的信号SIGCHLD:标识子进程停止或结束的信号SIGSTOP:来自键盘(Ctrl+Z)或调试程序的停止执行信号,84,信号通信,信号的处理的三种方式:,85,信号通信,信号发送函数:,#include#includeintkill(pi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论