欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    网络编程基础一.ppt

    • 资源ID:87677342       资源大小:237.50KB        全文页数:72页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    网络编程基础一.ppt

    设计、制作设计、制作:谭献海谭献海Email:2006年9月第1章 网络编程基础网络操作系统(Network Operating System,NOS)是使网络上的计算机能方便而有效地共享网络资源,为网络用户提供所需的各种服务软件和有关规程的集合。它除了具有一般桌面操作系统的全部功能外,还应该满足用户使用网络的需要,尤其要提供数据在网上的安全传输,管理网络中的共享资源,实现用户通信以及方便用户使用网络。网络操作系统是作为网络用户与网络系统之间的接口。网络操作系统的任务有两项:(1)常规任务,主要负责文件管理、存储管理、进程管理、任务管理、I/O管理、CPU调度等;(2)网络任务,主要功能为资源共享(文件、设备、数据)、安全管理、远程过程调用、网络I/O等。目前主流的四种主要网络操作系统是:Windows操作系统:Microsoft公司的Windows系列,如Microsoft的NT 或Windows 2000 Advanced Server等。UNIX或Linux。其中,UNIX操作系统主要有SUN公司的Solaris,IBM公司的AIX等。Linux操作系统主要有Redhat,红旗Linux等。Novell公司的Novell网(NetWare)Santa Cruz Operation公司(SCO)的UnixWare网络操作系统网络操作系统Windows API函数函数nWIN32API是MicrosoftWindows32位平台的应用程序编程接口。WIN32API函数是构筑Windows应用框架的基石,在它的下面是Windows的操作系统核心,上面则是所有的Windows应用程序,如下图所示。Windows API函数函数nWindowsAPI函数分为窗口函数、绘图函数、位图与图标函数、文本和字体函数、设备描述表函数、菜单函数、文件处理函数、Windows消息函数、硬件与系统服务函数、打印函数、网络函数、进程与线程函数。直接使用这些函数是比较复杂的。n目前常用的可视化编程环境(如VB、VC+、DELPHI等)中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32API函数基础之上的,是封装了的API函数的集合。它们把常用的API函数组合在一起成为一个控件或类库,并赋予其方便的使用方法,极大地加速了Windows应用程序开发的过程。n实际上如果要开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,虽然类库和控件使应用程序的开发简单的多,但它们只提供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。Windows API函数函数n附录WindowsAPI函数大全WindowsAPI函数应用实例-利用WindowsAPI函数和注册表获取系统信息nWindows API函数大全函数大全网络函数消息函数文件处理函数打印函数文本和字体函数菜单函数位图、图标和光栅运算函数绘图函数设备场景函数硬件与系统函数进程和线程函数控件与消息函数ByteordernLittleEndiannthelow-orderbyteofthenumberisstoredinmemoryatthelowestaddress,andthehigh-orderbyteatthehighestaddress.(Thelittleendcomesfirst.)nIntelprocessors(thoseusedinPCs)nBigEndiannthehigh-orderbyteofthenumberisstoredinmemoryatthelowestaddress,andthelow-orderbyteatthehighestaddress.(Thebigendcomesfirst.)nMotorolaprocessors(thoseusedinMacs)n4bytesLongInteger0 x99887766Byte3Byte2Byte1Byte099887766nBigEndianBaseAddress+0Byte399BaseAddress+1Byte288BaseAddress+2Byte177BaseAddress+3Byte066nLittleEndianBaseAddress+0Byte066BaseAddress+1Byte177BaseAddress+2Byte288BaseAddress+3Byte399Example一般的PC采用 Little Endian 网络通信采用 Big Endianchannel.sin_addr.s_addr=htonl(INADDR_ANY);channel.sin_port=htons(SERVER_PORT);UtilityroutinesnConvertbetweennetworkbyteorderandthelocalhostsbyteordernhtons(hosttonetworkshort)nntohs(networktohostshort)nhtonl(hosttonetworklong)nntohl(networktohostlong)进程和线程10技术背景n在计算机编程中,一个基本的概念就是同时对多个任务加以控制。如在基于Internet网上的可视电话系统开发中,同时要进行语音采集、语音编解码、图象采集、图象编解码、语音和图象码流的传输,所有的这些事情,都要并行处理。特别是语音信号,如果进行图象编解码时间过长,语音信号得不到服务,通话就有间断,如果图象或语音处理时间过长,而不能及时的传输码流数据,通信同样也会中断。这样就要求我们实现一种并行编程n在只有一个CPU的机器上,也就是要将该CPU时间按照一定的优先准则分配给各个事件,定期处理某一事件而不会在某一事件处理过长n最开始的时候,那些拥有机器低级知识的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。n目前:多进程/多线程进程n什么是进程?nUnix下的进程nUnix下的多进程编程n进程控制n信号处理n进程间通信什么是进程?几个定义:nAPUE:Anexecutinginstanceofaprogramiscalledaprocess.n不准确:程序一次运行可以创建多个进程n实质上根本不对:在Unix下程序的运行并不产生一个新进程n我的定义:进程是具有独立地址空间的运行单位Unix下的多进程编程1、进程控制2、信号处理3、进程间通信(IPC)进程控制n进程创建fork函数原型:#includepid_tfork(void);UNIX下最优美的函数。pid_t是一个unisignedint,是进程号对应的数据类型fork把子进程ID返回给父进程,把0返回给子进程,通过对返回值的检查就可知道当前是父进程还是子进程。进程创建n一般结构:if(pid=fork()0)parentscode;elseif(pid=0)childscode;elseerrorhandling;n父进程打开的文件描述字将被子进程继承。n获得当前进程id:getpid获得父进程id:getppid函数原型:#includepid_tgetpid(void);pid_tgetppid(void);进程创建执行一个新程序n执行程序系统调用execve函数原型:#includeintexecve(constchar*path,constchar*argv,constchar*envp);Unix还提供其它几个执行程序函数,execl,execlp,execle,execv,execvp都不是系统调用,依赖于execve。执行一个新程序npath,执行的文件nargv,参数表nenvp,环境变量表,一般直接用environ就行如:char*argv=“gcc”,“-g”,“-c”,“rbtree.c”,NULL;execve(“/usr/bin/gcc”,argv,environ);执行一个新程序execve启动一个新的程序,新的地址空间完全覆盖当前进程的地址空间,但当前进程把开的文件描述字(除非特别设置),当前工作目录等将被继承。execve只返回负值表示调用失败,如果成功的话将永不返回。system()()n功能:产生一个新的进程,子进程执行指定的命令。n语法:#includen#includenintsystem(string)nchar*string;n说明:本调用将参数string传递给一个命令解释器(一般为sh)执行,即string被解释为一条命令,由sh执行该命令。若参数string为一个空指针则为检查命令解释器是否存在。n返回值:当参数为空指针时,只有当命令解释器有效时返回值为非零。若参数不为空指针,返回值为该命令的返回状态(同waitpid())的返回值。命令无效或语法错误则返回非零值,所执行的命令被终止.其他情况则返回-1。n例子:charcommand81;ninti;nfor(i=1;i8;i+)nsprintf(command,ps-ttty%02i,i);nsystem(command);n等待进程完成n回收子进程结束状态信息wait,waitpid函数原型:#includepid_twait(int*stat_loc);pid_twaitpid(pid_tpid,int*stat_loc,intoptions);守护进程n在网络编程中,一般服务器程序在接收客户机连接请求之前,都要创建一个守护进程。n守护进程是Linux/Unix編程中一个非常重要的概念,在创建一个守护进程的时候,要接触到子进程、进程组、会晤期、信号机制以及文件、目录、控制终端等多个概念。n仔细阅读教科书中由CarlHarris编写的著名的代理服务器程序(proxy)中的守护进程daemonize()函数:信号处理n信号也称为软中断,是进程通信的一种最古老的方法。n系统用它通知一个或多个进程异步事件的发生n事件的种类包括:程序错误类,程序中止类,闹钟类,I/O类,作业控制类,操作错误类,其它n每个信号都有一个名字,以SIG开头n在/usr/include/asm/signal.h中列出所有的信号名(SIGxxx)。信号处理n当进程接收到一个信号(可能是自己发出,也可能是别的有权限的进程发出),它可以采取的动作可以是下面任意一种:n忽略信号:SIGSTOP与SIGKILL除外。n捕获信号:当信号出现时调用专门提供的一个函数,这个函数称为信号号柄。SIGSTOP与SIGKILL除外。n执行信号的默认动作。几个常见的信号nSIGINT:前台程序执行过程中按下Ctrl-c就会向它发出SIGINT信号,默认动作终止进程。nSIGKILL:立即中止进程,不能被捕获或忽略。nSIGTERM:kill命令默认的中止程序信号。nSIGQUIT:Ctrl-发出的信号,默认动作终止进程并生成core文件。nSIGALRM:定时器到期,可用alarm函数来设置定时器。默认动作终止进程。几个常见的信号nSIGCHLD:子进程终止或停止,默认动作为忽略。nSIGSTOP:停止进程。不可忽略或捕获。nSIGCONT:继续被停止进程。不可忽略。nSIGTSTP:Ctrl-z向程序发出的停止信号。nSIGUSR1、SIGUSR2:程序可利用信号。默认动作终止进程。信号的处理n系统调用signaln用于接受一个指定的信号,并可指定相应的处理方法n在signal.h定义nsignal(int sig,sighandler_t handler)nsig:指定信号类型nhandler:用于处理该信号的函数nSIG_IGN忽略该信号nSIGKILL和SIGSTOP不能忽略nSIG_DFL恢复对该信号的默认处理信号处理默认动作nSIGINTn终止该进程nSIGCHLDn忽略nSIGKILLn终止该进程nSIGSTOPn暂停进程nSIGALRMn终止该进程设置信号动作系统调用n设置定时器alarm,函数原型:#includeunsignedintalarm(unsignedintseconds);在seconds秒后对本进程发送一个SIGALRM信号。一般情况下返回0;如果已经有一个定时器被设置且还没有到时间,否返回上一个定时器剩余的时间。设置信号动作系统调用npause,sleep#includeintpause(void);intsleep(unsignedintseconds);sleep让进程睡眠seconds秒,pause让进程永远睡眠。如果在睡眠过程中被信号打断,它们将返回-1。信号的发送nkill给进程号为pid的进程发送一个sig信号npid0:发送给进程ID为pid的进程npid=0:发送给与自己同组,并且自己有权限向其发送的进程npid-1:发送给进程组ID为-pid的进程,并且自己有权限向其发送的进程npid=-1:所有自己有权限向其发送信号的进程信号的发送nraise调用给自己发关一个sig信号。因此,raise(sig);等价于kill(getpid(),sig);n发送信号的shell命令:kill。n在默认情况下发送的是SIGTERM信号n$kill12345等价于$killTERM12345,都是向进程12345发送一个SIGTERM信号。n$killKILL12345,向进程12345发送一个SIGKILL信号n管道通信nFIFO(有名管道)通信进程间通信(IPC)管道通信n最古老的UnixIPC工具,一个进程从管道一头写数据,另一个进程从管道另一头读数据。相通信方式是单向的。n创建管道pipe函数原型:#includeintpipe(intfdes1);pipe函数成功后,内核打开两个文件描述字fdes0,fdes1。nfdes1输入端,只能用于写;nfdes0为输出端,只能用于读。n一般文件的I/O函数都可以用于管道,如read、write、close等等。read(fd0,buf,size)Pipe()写端fd1fd0 读端write(fd1,buf,size)int main(void)pid_t pid;int fdes2;if(pipe(fdes)0)perror(“pipe”);exit(1);if(pid=fork()0)/父进程,写父进程,写 close(fdes0);write(fdes1,“Hmmmmmmmmmmm”,12);/*1 2 3 4 5 6 7 8 9 0 1 2*/else /子进程,读子进程,读 char buf4096;ssize_t n;close(fdes1)n=read(fdes0,buf,4096);if(n=0)bufn=0;printf(“%sn”,buf);return 0;管道通信管道破裂n如果一个管道的读端已经关闭,进程还继续向写端写数据,如:pipe(fdes);close(fdes0);write(fdes1,“Letmedie”,10);则进程会收到一个SIGPIPE信号,表示管道破裂。默认动作为结束进程。n读一个写端已经关闭的管道则read返回0。管道的局限性管道的局限性n只支持单向数据流;n只能用于具有亲缘关系的进程之间;n没有名字;n管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);n管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;FIFO通信nFIFO是一种特殊设备文件,又称为有名管道。操作方法与普通文件相同。n对于普通文件,我们可以从文件任一位置读数据,也可以从任一位置写数据;数据读完不会消失。但对FIFO来说,我们只能从文件头读数据,从文件尾写数据。数据被某进程读走之后就会消失。有名管道的打开有名管道的打开n有名管道比管道多了一个打开操作:open。nFIFO的打开规则是:如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。n如果当前打开操作是为写而打开FIFO时,如果已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作设置了阻塞标志);或者,返回ENXIO错误(当前打开操作没有设置阻塞标志)。程序程序:静态的计算机语言编写的代码。:静态的计算机语言编写的代码。进程进程:程序的一次执行。程序代码 程序数据 程序资源线程线程:进程中程序代码的一个执行序列。程序调用堆栈 线程局部变量 可共享访问进程中的数据和资源 操作系统按线程来调度程序的执行多进程多进程:操作系统中多个程序同时执行。多线程多线程:程序中多个片断同时执行。多线程的基本概念图示:线程和进程单进程、单线程如:MS-DOS多进程、每个进程一个线程如:UNIX单进程、多线程如:Java多进程、每个进程多个线程如:Windows2000、Solaris、Linux、Mach和OS/2线程和进程n每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。n线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。n多进程:在操作系统中,能同时运行多个任务(程序)。n多线程:在同一应用程序中,有多个顺序流同时执行。线程的状态线程的状态The status of thread(1)状态参数状态参数 寄存器状态寄存器状态(register status);堆栈堆栈(stack);线程运行状态线程运行状态(thread running status);优先级优先级(priority);线程专有存储器线程专有存储器(thread-private memory);信号屏蔽信号屏蔽(signal masking)。(2)线程运行状态线程运行状态 执行状态执行状态(executing);就绪状态就绪状态(ready);阻塞状态阻塞状态(blocked)。bornreadyrunningwaitingsleepingdeadblockedstart()dispatchquantum expirationyield()waitsleep()run completeissue I/O requestwait interval expiresnotify()notifyAll()interrupt()I/O completesleep interval expiresinterrupt()线程的生命周期及控制线程的生命周期及控制线程的暂停和恢复nsleep()方法nsuspend()和resume(),(运行程序)njoin()(运行程序)当前线程等待调用该方法的线程结束后,再恢复执行.TimerThreadtt=newTimerThread(100);tt.start();publicvoidtimeout()tt.join();/等待线程tt执行完后再继续往下执行n临界资源问题class stack int idx=0;char data=new char6;public void push(char c)dataidx=c;idx+;public char pop()idx-;return dataidx;多线程的互斥与同步两个线程A和B在同时使用Stack的同一个实例对象,A正在往堆栈里push一个数据,B则要从堆栈中pop一个数据。1)操作之前data=|p|q|idx=22)A执行push中的第一个语句,将c推入堆栈;data=|p|q|c|idx=23)A还未执行idx+语句,A的执行被B中断,B执行pop方法,返回q:data=|p|q|c|idx=14A继续执行push的第二个语句:data=|p|q|c|,|idx=2最后的结果相当于c没有入栈。n产生这种问题的原因在于对共享数据访问的操作的不完整性。为使系统中的多线程能有条不紊地运行,在系统中为使系统中的多线程能有条不紊地运行,在系统中必须提供用于线程间同步和通信的机制。为了支持不同频率必须提供用于线程间同步和通信的机制。为了支持不同频率的交互操作和不同程度的并行性,在多线程的交互操作和不同程度的并行性,在多线程OS中通常提供中通常提供多种同步机制:多种同步机制:互斥锁互斥锁条件变量条件变量计数信号量计数信号量多读、单写锁多读、单写锁线程间的同步和通信线程间的同步和通信 Synchronization and comm.between threads资源SyncStack生产者消费者生产者-消费者问题(同步问题)可能出现的问题可能出现的问题:生产者比消费者快时,消费者会漏掉一些数据没有取到生产者比消费者快时,消费者会漏掉一些数据没有取到消费者比生产者快时,消费者取相同的数据。消费者比生产者快时,消费者取相同的数据。假如生产者能和消费者通信,一旦它完成生产必需的数据,消费者将假如生产者能和消费者通信,一旦它完成生产必需的数据,消费者将不用完不用完CPU周期只是检查生产者是否己完成工作。周期只是检查生产者是否己完成工作。这种位于多线程内的交流称为这种位于多线程内的交流称为线程内部通信线程内部通信。线程内部通信用四种方法线程内部通信用四种方法wait(),notify(),notifyAll()和和yield()完成。完成。所有这些方法在所有这些方法在Object类里被说明成类里被说明成final。它们能用它们能用synchronized方法调用。方法调用。一、一、wait()方法方法在同步方法中使用在同步方法中使用wait()方法,使本线程等待,并允许其他线方法,使本线程等待,并允许其他线程使用这个同步方法。本线程放弃监督程序并睡眠直到另外一程使用这个同步方法。本线程放弃监督程序并睡眠直到另外一个线程调用个线程调用notifyAll()方法或者方法或者notify()方法。方法。语法:语法:public final void wait()throws InterruptedException;notify()和和wait()方法用来协调读取的关系。方法用来协调读取的关系。notify()和和wait()都只能从同步的方法中调用。都只能从同步的方法中调用。wait()和和sleep()方法都延迟线程的请求时间。方法都延迟线程的请求时间。如果使用如果使用wait()方法,可以使用方法,可以使用notify()方法恢复线程。方法恢复线程。但是用但是用sleep()方法不能这样做。方法不能这样做。二、二、notify()方法方法 notify()方法唤醒正在等候对象的当前监督程序的单线程。如方法唤醒正在等候对象的当前监督程序的单线程。如果多个线程在等待,果多个线程在等待,它只通知第一个处于等待的线程结束等它只通知第一个处于等待的线程结束等待。在任何时候仅有一个线程能拥有对象的监督程序。待。在任何时候仅有一个线程能拥有对象的监督程序。语法:语法:public final void notify();三、三、notifyAll()该方法用于唤醒所有正在等候对象监督程序的多线程。该方法用于唤醒所有正在等候对象监督程序的多线程。为调用为调用notify()或或notifyAll()方法,线程必须拥有对象的监督程方法,线程必须拥有对象的监督程序。序。四、四、yield()该方法使执行时间系统把当前线程放到睡眠状态并执行队列里该方法使执行时间系统把当前线程放到睡眠状态并执行队列里的下一个线程。的下一个线程。yield()方法保证低优先级的多进程也能获得处理器时间。方法保证低优先级的多进程也能获得处理器时间。语法:语法:public void static yield();nJAVA多线程系统调用-线程类线程类(Thread)的主要方法nThread(StringthreadName)n构造方法,并给线程指定一个名字nThread()n构造方法,让系统缺省设置线程名(Thread-#)nvoidrun()n线程所执行的代码nvoidstart()throwsIllegalThreadStateExceptionn使程序开始执行,多次调用会产生异常nvoidsleep(longmilis)n让线程睡眠一段时间,此期间线程不消耗CPU资源线程类(Thread)的其它方法nvoidinterrupt()n中断线程,nstaticbooleaninterrupted()n判断当前线程是否被中断(会清除中断状态标记)nbooleanisInterrupted()n判断指定线程是否被中断nbooleanisAlive()n判断线程是否处于活动状态(即已调用start,但run还未返回)nThreadcurrentThread()n返回当前线程对象的引用线程类(Thread)的其它方法nvoidsetName(StringthreadName)n改变线程的名字nStringgetName()n获得线程的名字nStringtoString()n例子:ThreadThread-0,1,testnvoidjoin(longmillis,intnanos)n等待线程结束线程的线程的interrupt方法方法 一个线程在执行完一个线程在执行完run()方法后就自动消灭了。如果方法后就自动消灭了。如果想在想在run()方法执行完之前就消灭该线程,可以让线方法执行完之前就消灭该线程,可以让线程调用程调用interrupt()方法。方法。这时该线程会捕获这时该线程会捕获InterruptException异常。异常。Windows下多线程编程技术及其实现下多线程编程技术及其实现n1、编写线程函数编写线程函数n所有线程必须从一个指定的函数开始执行,该函数称为线程函数,它必须具有下列原型:DWORDWINAPIMyThreadFunc(LPVOIDlpvThreadParm);该函数输入一个LPVOID型的参数,可以是一个DWORD型的整数,也可以是一个指向一个缓冲区的指针,返回一个DWORD型的值。n象WinMain函数一样,这个函数并不由操作系统调用,操作系统调用包含在KERNEL32.DLL中的非C运行时的一个内部函数,如StartOfThread,然后由StartOfThread函数建立起一个异常处理框架后,调用我们的函数。Windows下多线程编程技术及其实现下多线程编程技术及其实现n2、创建一个线程创建一个线程n一个进程的主线程是由操作系统自动生成,如果你要让一个主线程创建额外的线程,你可以调用来CreateThread完成。HANDLECreateThread(LPSECURITY_ATTRIBUTESlpsa,DWORDcbstack,LPTHREAD_START_ROUTINElpStartAddr,LPVOIDlpvThreadParm,DWORDfdwCreate,LPDWORDlpIDThread);其中lpsa参数为一个指向SECURITY_ATTRIBUTES结构的指针。如果想让对象为缺省安全属性的话,可以传一个NULL,如果想让任一个子进程都可继承一个该线程对象句柄,必须指定一个SECURITY_ATTRIBUTES结构,其中bInheritHandle成员初始化为TRUE。参数cbstack表示线程为自己所用堆栈分配的地址空间大小,0表示采用系统缺省值。参数lpStartAddr用来表示新线程开始执行时代码所在函数的地址,即为线程函数。lpvThreadParm为传入线程函数的参数,fdwCreate参数指定控制线程创建的附加标志,可以取两种值。如果该参数为0,线程就会立即开始执行,如果该参数为CREATE_SUSPENDED,则系统产生线程后,初始化CPU,登记CONTEXT结构的成员,准备好执行该线程函数中的第一条指令,但并不马上执行,而是挂起该线程。最后一个参数lpIDThread是一个DWORD类型地址,返回赋给该新线程的ID值。Windows下多线程编程技术及其实现下多线程编程技术及其实现n3、终止线程终止线程n如果某线程调用了ExitThread函数,就可以终止自己。VOIDExitThread(UINTfuExitCode);n这个函数为调用该函数的线程设置了退出码fuExitCode后,就终止该线程。调用TerminateThread函数亦可终止线程。BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);n该函数用来结束由hThread参数指定的线程,并把dwExitCode设成该线程的退出码。当某个线程不在响应时,我们可以用其他线程调用该函数来终止这个不响应的线程。Windows下多线程编程技术及其实现下多线程编程技术及其实现n4、设定线程的相对优先级设定线程的相对优先级n当一个线程被首次创建时,它的优先级等同于它所属进程的优先级。在单个进程内可以通过调用SetThreadPriority函数改变线程的相对优先级。一个线程的优先级是相对于其所属的进程的优先级而言的。BOOLSetThreadPriority(HANDLEhThread,intnPriority)n其中参数hThread是指向待修改优先级线程的句柄,nPriority可以是以下的值:THREAD_PRIORITY_LOWEST,THREAD_PRIORITY_BELOW_NORMAL,THREAD_PRIORITY_NORMAL,THREAD_PRIORITY_ABOVE_NORMAL,THREAD_PRIORITY_HIGHESTWindows下多线程编程技术及其实现下多线程编程技术及其实现n5、挂起及恢复线程挂起及恢复线程前面提到过可以创建挂起状态的线程(通过传递CREATE_SUSPENDED标志给函数CreateThread来实现)。当你这样做时,系统创建指定线程的核心对象,创建线程的栈,在CONTEXT结构中初始化线程CPU注册成员。然而,线程对象被分配了一个初始挂起计数值1,这表明了系统将不再分配CPU去执行线程。要开始执行一个线程,另一个线程必须调用ResumeThread并传递给它调用CreateThread时返回的线程句柄。DWORDResumeThread(HANDLEhThread);一个线程可以被挂起多次。如果一个线程被挂起3次,则该线程在它被分配CPU之前必须被恢复3次。除了在创建线程时使用CREATE_SUSPENDED标志,你还可以用SuspendThread函数挂起线程。DWORDSuspendThread(HANDLEhThread);应用程序与设备驱动程序之间的接口nVxD的概念的概念nWindows环境下驱动程序共有三类,一类是VxD(VirtualDeviceDriver,虚拟设备驱动程序),起源于Windows3.1,用于Windows95/98/Me操作系统中;一类是KMD(KernelModeDriver,内核模式驱动程序),用于WindowsNT下;还有一类就是WDM(Win32DriverMode,Win32驱动程序模型),是微软从Windows98开始,推出的一个新的驱动类型,它是一个跨平台的驱动程序模型,不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行。n由于Windows对系统底层操作采取了屏蔽的策略,因而对用户而言,系统变得更为安全,但这却给众多的硬件或者系统软件开发人员带来了不小的困难,因为只要应用中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属于系统级的虚拟设备驱动程序VxD。应用程序与硬件之间的接口n应用程序和硬件设备之间的沟通是由驱动程序来完成的,设备驱动程序对应用程序屏蔽和外设硬件的细节,这样对应用程序来说,外设只是一个设备文件,应用程序可以像操作普通文件一样来操作外设。n在Windows环境下应用程序通常使用Windows32API函数像访问文件那样来访问设备,通常用到的函数有CreatFile,ReadFile,WriteFile,CloseHandle和DeviceIoControl等等。应用程序与硬件之间的接口n对Win32应用程序来说,它必须首先调用CreateFile()函数得到一特定VxD的句柄。n通常这函数是用于创建打开磁盘文件的,但如果程序在调用它时,在文件名前加上前缀.DeviceName,系统就会识别出此文件名是对应于一VxD名。(注意在C/C+中,字符串中的反斜杠字符必须加更多的反斜杠前缀,因此.就成了.DeviceName)nDeviceName必须与设备驱动程序内定义的设备名称一致。应用程序与硬件之间的接口n函数CreateFile()返回一句柄,这里是一个VxD的句柄。应用程序可用这个句柄调用函数DeviceIoControl()来发消息给VxD。n函数DeviceIoControl()提供了通知VxD执行何种功能的参数,同时提供用于在应用程序和VxD间传送数据的输入输出缓冲区指针。n然后,通过调用函数ReadFile和WriteFile进行设备数据的读写。n当应用程序终止时,它要调用函数CloseHandle()释放这个VxD的句柄。应用程序与硬件之间的接口n在Windows中,应用程序通过win32API函数DeviceIoControl来实现对设备的访问获取信息、发送命令、交换数据等。利用该接口函数向指定的设备驱动发送正确的控制码及数据,然后分析它的响应,就可以实现应用程序与VxD之间的通信。nDeviceIoControl的函数原型为:BOOLDeviceIoControl(HANDLEhDevice,/设备句柄DWORDdwIoControlCode,/控制码LPVOIDlpInBuffer,/输入数据缓冲区指针DWORDnInBufferSize,/输入数据缓冲区长度LPVOIDlpOutBuffer,/输出数据缓冲区指针DWORDnOutBufferSize,/输出数据缓冲区长度LPDWORDlpBytesReturned,/输出数据实际长度单元长度LPOVERLAPPEDlpOverlapped/重叠操作结构指针);应用程序与硬件之间的接口n其中,n设备句柄用来标识你所访问的设备。n发送不同的控制码,可以调用设备驱动程序的不同类型的功能。在头文件winioctl.h中,预定义的标准设备控制码,都以IOCTL或FSCTL开头。例如,IOCTL_DISK_GET_DRIVE_GEOMETRY是对物理驱动器取结构参数(介质类型、柱面数、每柱面磁道数、每磁道扇区数等)的控制码,FSCTL_LOCK_VOLUME是对逻辑驱动器的卷加锁的控制码。n输入输出数据缓冲区是否需要,是何种结构,以及占多少字节空间,完全由不同设备的不同操作类型决定。在头文件winioctl.h中,已经为标准设备预定义了一些输入输出数据结构。n重叠操作结构指针设置为NULL,DeviceIoControl将进行阻塞调用;否则,应在编程时按异步操作设计。应用程序与设备驱动程序之间的接口n串口通信程序实例(参看教科书)Thank You!

    注意事项

    本文(网络编程基础一.ppt)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开