摘要:它必须以如下行开始(必须放在文件的第一行):代码:#!/bin/sh 符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑完了,如果要执行该脚本,还必须使其可执行:代码:chmod +x filename 这样输入 ./filename 便可执行该脚本。注释 shell脚本中以# 开始的行表示注释,直到一行的结束。变量 在其它编程语言中,你必须使用变量。shell编程中,所有变量都由字符串组成,并且不需要声明。要给一个变量赋值,你可以这么写:代码:变量名=值(等号左右的变量和值要连在一起写,不要有空格)在变量名之前加一个$,就可以取出变量值:代码:#!/bin/sh#对变...
阅读全文
摘要:----------------------------------------
阅读全文
摘要:--------------------yum软件包管理器Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。软件包来源可供Yum下载的软件包包括Fedora本身的软件包以及源自rpmfusion和rpm.livna.org的Fedora Extras,全部是由Linux社区维护的,并且基本是自由软件。图形化前端Yum的图形化前端主要有yu
阅读全文
摘要:26.1. 概述Unix上三种最常用的数据链路访问方法1. BSD的BSD分组过滤器BPF2. SVR4的数据链路提供者接口DLPI3. Linux的SOCK_PACKET接口26.2. BPF: BSD分组过滤器使用BPF获得分组:虽然在数据链路嵌入一个分组捕获机制并不困难,BPF的强大威力却在于它的过滤功能。26.3. DLPI:数据链路提供者接口使用DLPI, pfmod和bufmod捕获分组应用进程介入数据链路层只需打开设备(例如le0)并使用DLPI的DL_ATTACH_REQQ请求将它与DLPI附接就可以了。不过为了提高效率,一般还需压入两个流模块:pfmod(在内核中进行分组过滤
阅读全文
摘要:25.1. 概述原始套接口提供以下三种TCP及UDP套接口一般不提供的功能。1. 使用原始套接口可以读写ICMPv4,IGMPv4,ICMPv6分组。例如:Ping程序,就使用原始套接口发送ICMP回射请求,并接受ICMP回射应答。用于多播路由的守护进程:mrouted,同样利用原始套接口来发送和接收IGMPv4分组。上述功能同样允许使用ICMP或IGMP构造的应用程序完成作为用户进程处理,而不必在增加过多的内核编码。例如,路由器发现守护进程(在Solaris 2.x下名为in.rdisc,TCPv1的附录F说明如何获得公开可得版本的源代码)即以这种方式构造。它处理内核完全不知道的两个ICMP
阅读全文
摘要:1. ACE - Adaptive Communication Environment http://www.cs.wustl.edu/~schmidt/ACE.html2. Common G++ (GNU) http://www.gnu.org/software/commoncpp/ 3. Socket++ version 1.11 http://www.cs.utexas.edu/users/lavender/courses/socket++/4. Socket++ version 1.12+ http://www.linuxhacker.at/socketxx5. SocketMan h
阅读全文
摘要:24.1. 概述IPv4允许在固定的20字节头部之后跟以40字节的选项。虽然定义了10个不同的选项,但最常用的是源路径选项,这些选项透过IP_OPTIONS套接口选项访问。IPv6允许在固定的40字节IPv6头部和传输层头部(如ICMPv6,TCP或UDP)之间出现扩展头部(extension header)。和IPv4不同的是,访问IPv6扩展头部的途径不是强迫用户去理解头部如何出现在IPv6分组中的实际细节,而是通过函数接口进行。24.2. IPv4选项getsockopt和setsockopt(level参数为IPPROTO_IP,optname参数为IP_OPTIONS)读取和设置IP
阅读全文
摘要:23.1. 概述在传统的UNIX模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。UNIX下的大多数网络服务器程序都是这么编写的,这在我们的并发服务程序例子中可以看出:父进程接收连接,派生子进程,子进程处理与客户的交互。虽然这种模式很多年来使用的很好,但是fork有一些问题:1. fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要在子进程中复制等等。目前的实现使用一种称做写时拷贝(copy-on-write)技术,可避免父进程数据空间向子进程的拷贝,除非子进程需要自己的拷贝。尽管有这种优化技术,fork仍然是昂贵的。2. fork
阅读全文
摘要:22.1. 概述信号驱动是指当某个描述字上发生了某个事件时,让内核通知进程。这里描述的信号驱动不是真正的异步I/O。第15章描述的非阻塞I/O同样不是异步I/O。在非阻塞I/O中,启动I/O操作后内核并不像真正的异步I/O那样立即返回,它只有在进程非得睡眠才能完成操作时才立即返回。22.2. 套接口上的信号驱动I/O使用套接口上的信号驱动I/O(SIGIO)需要进程执行以下三个步骤:1. 给SIGIO信号建立信号处理程序2. 设置套接口属主,通常使用fcntl的F_SETOWN命令3. 激活套接口的信号驱动I/O,通常使用fcntl的F_SETFL命令打开O_ASYNC标志UDP套接口上的SI
阅读全文
摘要:21.1. 概述许多传输层有带外数据(out-of-band data)的概念,有时也称为加速数据(expedited data).21.2. TCP带外数据TCP没有真正的带外数据,而是提供了一个我们要讨论的紧急模式(urgent mode)。假设一个进程已向一个TCP套接口写入了N字节数据,并且这些数据被TCP放入套接口发送缓冲区等待发送给对方。我们在图21.1中展示了这种状态,并且标记了从1到N的数据字节。进程现在使用send函数和MSG_OOB标志发送一个包含ASCII字符a的带外数据字节:send(fd, "a", 1, MSG_OOB);TCP将数据放置在套机口
阅读全文
摘要:20.1. 概述本章是各种影响应用程序使用UDP套接口话题的一个集合。首先是确定UDP数据报的目的地址以及是从哪个接口接收数据报的,因为一个绑定UDP端口和通配地址的套接口能在任何接口上接收单播、广播和多播数据报。TCP是一个字节流协议,它使用一个滑动窗口,它没有像记录边界或者允许发送者用数据淹没接收者等事情需要考虑。然而对于UDP,每个输入操作对应一个UDP数据报,所以当接收的数据报比应用进程的输入缓冲区大时,就产生了如何处理的问题。UDP是不可靠的,但对一些应用程序来说使用UDP而不用TCP是有意义的如果实现不支持IP_RECVDSTADDR套接口选项,那么一个确定UDP数据报目的IP地址
阅读全文
摘要:19.1 概述单播地址标识单个接口,广播地址标识子网上的所有接口,多播地址标识一组接口。单播和广播是编制方案的两个极端(要么一个要么全部),多播的目的就在于提供一种折衷方案。多播数据报仅由对该数据报感兴趣的接口接收,也就是说,由运行希望参加多播会话应用系统的主机上的接口接收。广播一般局限于局域网,而多播既可用于局域网,也可跨越广域网。19.2. 多播地址IPv4多播地址和IPv6多播地址IPv4中的D类地址(从224.0.0.0到239.255.255.255)是多播地址。D类地址的低28位构成了多播组ID(group ID),而整个32位地址则称为组地址(group address)。下面是
阅读全文
摘要:18.1. 概述广播的用途之一是将定服务器主机在本地子网上,但不知到它的单播IP地址时,对它进行定位,这就是资源发现(resouce discovery)。另一用途是当有多个客户和单个服务器通信时,减少局域网上数据流量。实际例子有: ARP(地址解析协议, Address Resolution Protocol),BOOTP(引导协议,Bootstrap Protocol),NTP(网络时间协议,Network)。18.2 广播地址如果用{netid, subnetid, hostid}( {网络ID,子网ID,主机ID})表示IPv4地址。那么有四种类型的广播地址,我们用-1表示所有比特位均
阅读全文
摘要:17.1. 概述在路由器接口中支持三种类型的操作1. 进程能通过写路由套接口向内核发消息。2. 进程能在路由套接口上从内核读消息,这是核心通知进程已收到一个ICMP重定向消息并进行了处理的方式。3. 进程可以用sysctl函数得到路由表或列出所有已配置的接口。17.2. 数据链路套接口地址结构在路由套接口上返回的一些消息中包含数据链路套接口地址结构,他在<net/if_dl.h>定义struct sockaddr_dl { uint8_t sdl_len; sa_family_t sdl_family; /* AF_LINK */ uint16_t sdl_index; /* ..
阅读全文
摘要:16.1. 概述在传统上ioctl函数是用于那些普遍使用,但不适合归入其他类别的任何特性的系统接口。网络程序中ioctl常用于在程序启动时获得主机上所有接口的信息:接口的地址,接口是否支持广播,是否支持多播,等等。16.2. ioctl函数这个函数影响由fd参数指向的打开的文件#include<unistd.h>int ioctl(int fd, int request, ... /* void * arg */); // 返回: 成功返回0,出错返回-1第三个参数总是一个指针,但指针的类型依赖于request(请求)我们可以把和网络有关的请求分为6类:1. 套接口操作2. 文件操
阅读全文
摘要:15.1 概述缺省状态下,套接口是阻塞方式的。这意味着当一个套接口调用不能立即完成时,进程进入睡眠状态,等待操作完成。我们将可能阻塞的套接口调用分成四种。1. 输入操作: read, readv, recv, recvfrom和recvmsg函数。2. 输出操作: write, writev, send, sendto和sendmsg函数。3. 接收外来连接: accept函数4. 初始化外出的连接: 用于TCP的connect函数15.2. 非阻塞读和写: str_cli函数(Revisited)非阻塞并且直接使用read和write以代替标准I/O我们维护两个缓冲区: to容纳从标准输入到
阅读全文
摘要:14.1. 概述Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API(套接口或XTI)的一种方法。当客户和服务器在同一台主机上时,Unix域协议是IPC通信方式的一种替代品。Unix域提供了两种类型的套接口:字节流套接口(与TCP类似)和数据报套接口(与UDP类似)。14.2. Unix域套接口地址结构// 在《sys/un.h>头文件中定义的Unix域套接口地址结构struct sockaddr_un{ uint8_t sun_len; sa_family_t sun_family; /* AF_LOCA
阅读全文