04-系统调用、网络编程、数据库访问.ppt

上传人:qwe****56 文档编号:79008734 上传时间:2023-03-19 格式:PPT 页数:43 大小:401.50KB
返回 下载 相关 举报
04-系统调用、网络编程、数据库访问.ppt_第1页
第1页 / 共43页
04-系统调用、网络编程、数据库访问.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述

《04-系统调用、网络编程、数据库访问.ppt》由会员分享,可在线阅读,更多相关《04-系统调用、网络编程、数据库访问.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Linux培训讲义培训讲义基于Ubuntu,RHEL系统调用、网络编程、数据库访问培训内容培训内容系统调用网络编程理论网络编程API数据库访问系统调用系统调用Linux系统的一切都可以用文件代表,或者可以用一个特殊的文件进行操作。目录是一个特殊的文件,不可直接读写。设备也是文件,可以用文件API进行操作。设备可以分为字符设备和块设备,两者的区别在于访问设备的时候是否需要一次读写一块数据。系统调用系统调用Linux,Unix中比较重要的三个设备文件:/dev/console此设备代表控制台,错误信息和诊断信息通常发送到这个设备。/dev/tty如果一个程序有控制终端,那么/dev/tty就是这个

2、控制终端的别。/dev/null空设备,所有写入这个设备的内容将被丢弃。系统调用系统调用系统调用定义:所有的操作系统在其内核里都有一些内建的函数,这些函数可以用来完成一些系统级别的功能。Linux系统使用的这样的函数叫做“系统调用”,英文是systemcall。这些函数代表了从用户空间到内核空间的一种转换,例如在用户空间调用open函数,则会在内核空间调用sys_open。一个已经安装的系统的支持的所有的系统调用可以在/usr/include/bits/syscall.h文件里面看到。系统调用系统调用hwanglangchao hwang$head/usr/include/bits/sysca

3、ll.h/*Generated at libc build time from kernel syscall list.*/#ifndef _SYSCALL_H#error Never use directly;include instead.#endif#define SYS_stime _NR_stime#define SYS_getresuid _NR_getresuid#define SYS_rt_sigqueueinfo _NR_rt_sigqueueinfo#define SYS_mmap2 _NR_mmap2 系统调用系统调用每个系统调用都有一个定义好的数字,这些数字是用来构造这

4、些系统调用的。内核通过0 x80中断来管理这些系统调用。这些系统调用的对应的数字和一些参数都在调用的时候送到某些寄存器里面。系统调用的数字实际上是一个序列号,表示其在系统的一个数组sys_call_table中的位置。系统调用定义:系统调用是操作系统提供给外部程序的接口。在 C 语言中,操作系统的系统调用通常通过函数调用的形式完成,这是因为这些函数封装了系统调用的细节,将系统调用的入口、参数以及返回值用 C 语言的函数调用过程实现。系统调用函数定义在 glibc中,需要注意以下几点:系统调用函数通常在成功时返回 0 值,不成功时返回非零值。如果要检查失败原因,则要判断全局变量 errno 的值

5、,其 中包含错误代码。许多系统调用的返回数据通常通过引用(传地址)参数传递。这时,需要在函数参数中传递缓冲区地址,而返回的数据就保存在该缓冲区中。文件操作文件操作文件操作在I/O操作中,直接使用底层系统调用的效率比较低。原因是:同函数调用相比,系统调用的开销大些,因为在执行系统调用的时候,Linux必须从用户代码切换到内核代码运行,然后再返回用户代码。尽可能的减少系统调用,在系统调用中做尽可能多的工作。硬件会对底层系统调用一次所能读写的数据块作出一定的限制。文件操作文件操作文件描述符:每个运行中的程序被称为进程,它有个与之相关联的文件描述符。文件描述符是一些小值整数,可以通过文件描述符访问打开

6、的文件或者设备。多少文件描述符取决于系统的配置情况。当开始运行程序的时候一般会有三个打开的文件描述符:0:标准输入1:标准输出2:标准错误文件操作文件操作write 写文件描述符系统调用write的作用是把缓冲区buf的前nbytes个字节写入文件描述符关联的文件中。函数返回写入的字节数。如果文件描述符有错或者底层的设备驱动程序对数据块长度比较敏感,返回值可能小于nbytes。如果这个函数的返回值是0,就表示没有写入任何数据,如果是-1则表示函数调用出错,对应的代码保存在全局变量errno里面。#include size_t write(int fides,const void*buf,siz

7、e_t nbytes)write可能报告写入字节比nbytes少,这并不一定是个错误应该用errno检查错误。文件操作文件操作read 读文件描述符系统调用read的作用是从和文件描述符fildes相关联的文件里面读入nbytes个字节的数据,并把它们放到数据区buf中。他返回实际读入的字节数,他可能会小于请求的字节数。如果read调用返回0,就表示未读入任何数据,已经达到了文件尾。如果是-1则表示read出错。size_t read(int fildes,void*buf,size_t nbytes)文件操作文件操作open 创建文件描述符open建立了一条文件或者设备的访问路径,如果操作成

8、功,它将返回一个文件描述符,用read和write可以会这个文件描述符进行操作。这个文件描述符是唯一的,他不会同任何其他运行中的进程共享。如果两个程序同时他开一个文件,会得到两个不同的描述如,如果他们都会文件进行写操作,他们会各写个的,后面的写入的内容将覆盖前面些的内容。open是个原子操作。文件操作文件操作#include#include#include int open(const char*path,int oflags)int open(const char*path,int oflags,mode_t mode)文件操作文件操作open在调用成功的时候返回一个新的文件描述符,它总是一

9、个非负的整数,失败时返回-1。并且设置全局变量errno,指明错误的原因。新文件描述符总是使用没有使用的文件描述符的最小值。此特征很有用。另外还有一个create调用,但是这个哦调用很少用,这个调用不但会创建文件而且会打开文件。这里跳过一个系统调用ioctl,这个函数提供了一个用于控制设备、及其文件描述符行为和配置底层服务的接口。这个函数太大了。文件操作文件操作umask 设置文件掩码只有在创建文件的时才指定访问权限,其次,用户掩码(由shell的umask设定),会影响到被创建文件的访问权限。open调用李给出的模式值减和当时的用户操作的反值做与操作。umask是一个系统变量,其作用是,当文

10、件被创建的时候为文件的访问设定一个掩码。执行umask命令可以修改这个变量。文件操作文件操作close 关闭文件描述符和文件之间的关联用close调用终止一个文件描述符fildes和其对应的文件之间的关联。文件描述符被释放并且能被重用。close调用成功返回0。#include int close(int fildes)检查close调用的返回结果很重要,有的文件系统,特别是网络文件系统可能不会在关闭文件之前报告文件写操作中的错误。因为执行写操作时,数据可能没有被确认写入。注:运行中的程序能够一次打开的文件数目是有限制的。限制是在limit.h中的OPEN_MAX定义。文件操作文件操作例子:1

11、、使用系统调用打开文件,读内容,然后写入一个新文件当中。2、使用c/c+标准库进行上面相同操作。比较两个程序耗时。网络编程(套接字为主)套接字定义:套接字是一种使用标准Unix文件描述符和其它程序通讯的方式。通过这种机制,开发工作可以在本地进行,也可以在网络上进行。有很多种套接字。有DARPAInternet地 址(Internet套接字),本地节点的路径名(Unix套接字),CCITTX.25地址等。这里只讲一种:Internet套接字。网络编程理论常用的Internet套接字的两种类型:StreamSockets(流格式)SOCK_STREAMDatagramSockets(数据包格式)S

12、OCK_DGRAM数据报套接字有时也叫“无连接套接字”。流式套接字是可靠的双向通讯的数据流,是有连接的套接字。网络编程理论使用有连接套接字的程序:ssh,telnet,http等TCP协议(ransmissionControlProtocol)TCP控制数据传输的准确性。使用无连接套接字的程序:QQ,ICQ,DNS等。UDP协议(User Datagram Protocol)系统占用资源比较少,速度快。网络编程理论UDP VS TCPTCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只在接收到该确认消息之后才继续传送其它信息,否则将一直

13、等待直到收到确认信息为止。tcp 打电话 UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报丢失,协议本身并不能做出任何检测或提示。udp发短信网络编程理论数据传输概述,OSI七层模型网络编程理论OSI七层模型和TCP/IP的四层模型的关系网络编程API两种字节排列顺序:网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。主机字节顺序(HBO,Host Byte Order):不同的机器HBO不相同,与CPU设计有关计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。In

14、ternet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换。网络编程APINBO和HBO转换APIhtons()HosttoNetworkShorthtonl()HosttoNetworkLongntohs()NetworktoHostShortntohl()NetworktoHostLong将数据放到网络上的时候,必须是网络字节序。网络编程APIstructsockaddrstructsockaddrunsignedshortsa_family;/AF_xxxcharsa_data14;/14字节协议地址;

15、/sa_family有很多种,在这里只选择AF_INET/sa_data包含套接字中目标地址和端口信息 网络编程APIstructsockaddr_inin代表Internetstructsockaddr_inshortintsin_family;unsignedshortintsin_port;structin_addrsin_addr;unsignedcharsin_zero8;structin_addrunsignedlongs_addr;网络编程APIstruct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4;S_un_b;/An IP

16、v4 address formatted as four u_chars.struct u_short s_w1,s_w2;S_un_w;/An IPv4 address formatted as two u_shortsu_long S_addr;/An IPv4 address formatted as a u_long S_un;网络编程API注意sin_zero(它被加入到这个结构,并且长度 和structsockaddr一样),当使用函数bzero()或memset()来全部置零。同时,这一重要的字节,一个指 向sockaddr_in结构体的指针也可以被指向结构体sockaddr并且

17、代替它。这样的话即使socket()想要的 是structsockaddr*,你仍然可以使用structsockaddr_in,并且在最后转换。同时,注 意sin_family和structsockaddr中的sa_family一致并能够设置为AF_INET。最 后,sin_port和sin_addr必须是网络字节顺序(NetworkByteOrder)!网络编程API创建套接字:socket()#include;#include;intsocket(intdomain,inttype,intprotocol)domain:这里只取AF_INET type:SOCK_STREAM,SOCK_D

18、GRAM protocol:设置为0protocol,socket相关的取值可以man。网络编程API绑定套接字:bind()#include;#include;intbind(intsockfd,structsockaddr*my_addr,intaddrlen);sockfd调用socket返回的文件描述符。my_addr指向数据结构structsockaddr的指针,它保存你的地址(即端口和IP地址)信息。addrlensizeof(structsockaddr)。my_addr.sin_port,my_addr.sin_addr.s_addr是网络字节顺序。网络编程API连接:conn

19、ect()#include#includeintconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);sockfd系统调用socket()返回的套接字文件描述符。serv_addr保存着目的地端口和IP地址的数据结构structsockaddr。addrlensizeof(structsockaddr)。网络编程API监听:listen()intlisten(intsockfd,intbacklog);sockfd调用socket()返回的套接字backlog在进队列中允许的连接数目。进入的连接是在队列中一直等待直到接受的连接数目。它们的

20、数目限制于队列的允许。大多数系统的允许数目是20。也就是通常意义上的并发连接数。网络编程API接受连接:accept()#includeintaccept(intsockfd,void*addr,int*addrlen);sockfd套接字描述符。addr指向局部的数据结构sockaddr_in的指 针。addrlen-局部的整 形变量,设置为sizeof(structsockaddr_in)函数工作过程如下:连接将加入到连接队列中。调 用accept()接受连接,此函数返回一个新的套接字文件描述符,这时我么你就有两个套接字,原来的还在侦听原来的端口,新的在准备发送(send()和接收(rec

21、v()数据。网络编程API接受发送数据:send(),recv()intsend(intsockfd,constvoid*msg,intlen,intflags);sockfd发送数据的套接字描述符,或是调用socket()或者是accept()返回的。msg将发送的数 据的指针。len数据的长度。flags设置为0就可以了。详细的资料请看send()的manpage)。网络编程APIintrecv(intsockfd,void*buf,intlen,unsignedintflags);sockfd要读的套接字描述符。buf要读的信息的缓冲。len 缓冲的最大长度。flags设置为0 这两个函

22、数用于流式套接字或者数据报套接字的通讯。网络编程API定向发送接收:sendto(),recvfrom()intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);to指向数据结构structsockaddr的指针,它包含了目的地的IP地址和端口信息。tolen设置为sizeof(structsockaddr)。和函数send()类似,sendto()返回实际发送的字节数。网络编程APIintrecvfrom(intsockfd,void*buf,intlen,unsig

23、nedintflags,structsockaddr*from,int*fromlen);from指向局部数据结构structsockaddr的指针,内容是源机器的IP地址和端口信息。fromlenint型的局部指针,它的初始值为sizeof(structsockaddr)。函数调用返回后,fromlen保存着实际储存在from中的地址的长度。如果用connect()连接一个数据报套接字,可以简单的调用send()和recv()来满足要求。这个时候依然是数据报套接字,依然使用UDP,系统套接字接口会动加上目标和源的信息。网络编程API关闭套接字:close(),shutdown()。可以使用一

24、般的Unix文件描述符的close()函数:close(sockfd);它将防止套接字上更多的数据的读写。任何在另一端读写套接字的企图都将返回错误信息。也可以使用shutdown()函数:intshutdown(intsockfd,inthow);how的值是下面的其中之一:0不允许接受,1不允许发送2不允许发送和接受(和close()一样)shutdown()成功时返回0,失败时返回-1(同时设置errno。)如果在无连接的数据报套接字中使用shutdown(),那么只不过是让send()和recv()不能使用(记住你在数据报套接字中使用了connect后是可以使用它们的)。网络编程APIg

25、etpeername()#includeintgetpeername(intsockfd,structsockaddr*addr,int*addrlen);得到连接的流式套接字另外一边的地址。sockfd连接的流式套接字的描述符。addr一个指向结构structsockaddr(或者 是structsockaddr_in)的指针,它保存着连接的另一边的信息。addrlen一个int型的指针,初始化 为sizeof(structsockaddr)。函数在错误的时候返回-1,设置相应的errno。网络编程APIgethostname()返回程序所运行的机器的主机名字。#include;intgethostname(char*hostname,size_tsize);参数很简单:hostname是一个字符数组指针,它将在函数返回时保存主机名。size是hostname数组的字节长度。函数调用成功时返回0,失败时返回-1,并设置errno。网络编程API例子程序1、使用TCP的服务端,客户端。2、使用UDP的服务端,客户端。注意程序服务器,客户端的连接过程。注意TCP和UDP的传输差别。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

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

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