Linux网络编程——socket编程

51 篇文章 6 订阅
7 篇文章 0 订阅

一、socket

socket 网络套接字

一个文件文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现(接收缓冲区和发送缓冲区))

通讯过程中,套接字一定是 【成对】 出现的。

二、网络字节序


小端法(PC本地存储):	高位存高地址。低位存低地址。     
大端法(网络存储): 		高位存低地址。低位存高地址。


涉及的四个函数:

man htonl

		1.NAME
		       htonl, htons, ntohl, ntohs - convert values between host and network byte order
		
		2.SYNOPSIS
		       #include <arpa/inet.h>
		
		       uint32_t htonl(uint32_t hostlong);	//本地->网络(IP) converts the unsigned integer hostlong from host byte order to network byte order.
													//这里的IP指的不是192.168.1.1这样的字符串形式
													
		       uint16_t htons(uint16_t hostshort); 	//本地->网络(Port) converts the unsigned short integer hostshort from host byte order to network byte order.
		
		       uint32_t ntohl(uint32_t netlong);	//网络->本地(IP) converts the unsigned integer netlong from network byte order to host byte order.
		
		       uint16_t ntohs(uint16_t netshort);	//网络->本地(Port) converts the unsigned short integer netshort from network byte order to host byte order.

三、IP地址转换函数

主机字节序(小端)和网络字节序(大端)相互转换时,需要用到此节提到的转换函数。
1.inet_pton()//本地字节序(string IP)-> 网络字节序
			//客户端connect()函数会用到
		man inet_pton
		
		1)NAME
		       inet_pton - convert IPv4 and IPv6 addresses from text to binary form
				
		2)SYNOPSIS
		       #include <arpa/inet.h>
		
		       int inet_pton(int af, const char *src, void *dst);
		3)PARAMETER
				af:指定IP协议
							AF_INET  IPv4
							AF_INET6 IPv6
				src:传入IP地址(点分十进制,192.168.1.1)
				dst:值结果参数,传出转换后的网络字节序 IP 地址。
		4)RETURN VALUE
		       inet_pton() returns  
		       1 on success (network address was successfully converted).  
		       0 is returned if src does not contain a character string repre‐senting a valid network address in the specified address family.  If af does not contain a valid address family, 
		       -1 is returned and errno is  set to EAFNOSUPPORT.					
					

2.inet_ntop() //网络字节序-> 本地字节序(string IP)
			 //服务端accept()函数会用到
		1)NAME
		       inet_ntop - convert IPv4 and IPv6 addresses from binary to text form
		
		2)SYNOPSIS
		       #include <arpa/inet.h>
		
		       const char *inet_ntop(int af, const void *src,
		                             char *dst, socklen_t size);
		3)PARAMETER
				af:指定IP协议
							AF_INET  IPv4
							AF_INET6 IPv6
				src: 传入网络字节序 IP 地址
				dst:值结果参数,传出转换后的IP地址(点分十进制,192.168.1.1)。
		4)RETURN VALUE
		       On success, inet_ntop() returns a non-null pointer to dst.  
		       NULL is returned if there was an error, with errno set to indicate the error.

四、sockaddr 和 sockaddr_in 地址结构体

  1. sockaddr 和 sockaddr_in 区别

    大小相同,都是16字节。
    区别在于:sockaddr 诞生日期早,底层封装应用的多。
    		 sockaddr_in 后来诞生,更精细化,现在更常用。
    
    故现在使用的都是 sockaddr_in,但在bind(),accept()时都需要将sockaddr_in强转为sockaddr才行 。
    

在这里插入图片描述

  1. sockaddr_in结构体详解

    man 7 ip  //查看 sockaddr_in 信息
    
    			struct sockaddr_in {
                   sa_family_t    sin_family; /* address family: AF_INET */
                   in_port_t      sin_port;   /* port in network byte order */
                   struct in_addr sin_addr;   /* internet address */
               };
    
               /* Internet address. */
               struct in_addr {
                   uint32_t       s_addr;     /* address in network byte order */
               };
    
    
    
    
  2. 实际应用

    man 7 ip  //查看 sockaddr_in 信息
    
    
    
    
    实际应用步骤如下:
    	1.定义并赋值 sockaddr_in 结构体
    	2.将 socketaddr_in 强转为 sockaddr 指针类型。
    
    示例:
    	struct sockaddr_in addr;
    	addr.sin_family = AF_INET; //AF_INET6
    	addr.sin_port = htons(8080);
    	/* 方式 1,这种不常用。
    	inet_pton(AF_INET,"10.219.10.193",(void*)&addr_s.sin_addr);
    	或者
    	int dst;
    	inet_pton(AF_INET,"192.168.1.1",(void*)dst);
    	addr.sin_addr.s_addr = dst;
    	*/
    	
    	//方式2 ,这是常用方式。
    	addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY 取系统中有效的任意IP地址,二进制类型。
    	bind(fd,(struct sockaddr*)addr,size);
    	
    

五、服务端和客户端通讯

	一般通讯由 3 个描述符组成。
	一对用于客户端和服务器通讯,一个用于监听。
	
	listen()函数的作用是设置监听上线(同一时刻接收到连接的个数),而不是设置监听。
	accept()函数才是阻塞监听客户端连接。
	 		accept()接收到客户端connect()连接后会生成一个新的socket用于通讯,而accept()调用的 fd 会返回继续进行监听。
	
	客户端在connect()前没有显示bind()绑定客户端地址,那采用的就是“隐式绑定”。

在这里插入图片描述
在这里插入图片描述

六、TCP网络编程涉及函数

  1. socket

    man 2 socket
    
    1.NAME
           socket - create an endpoint for communication
    
    2.SYNOPSIS
           #include <sys/types.h>          /* See NOTES */
           #include <sys/socket.h>
    
           int socket(int domain, int type, int protocol);
    3.PARAMETER
    		domain:		常用的有3个:
    					 		AF_UNIX //Local communication   
    					 		AF_INET //IPv4 Internet protocols
    					 		AF_INET6 //IPv6 Internet protocols                    		 
    		type: 常用的有2个:
    					SOCK_STREAM //流 TCP
    					SOCK_DGRAM //报文 UDP
    		protocol:默认 0 即可。 //所选用协议的代表协议是什么,也就是type对应的协议。0就是默认的指代。默认:SOCK_STREAM -> TCP ;SOCK_DGRAM -> UDP.  
    4.RTETURN VALUE
    		On success, a file descriptor for the new socket is returned.  
    		On error, -1 is returned, and errno is set appropriately.
    
  2. bind

    man 2 bind
    
    1.NAME
           bind - bind a name to a socket
    
    2.SYNOPSIS
           #include <sys/types.h>          /* See NOTES */
           #include <sys/socket.h>
    
           int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    3.PARAMETER
    		sockfd: socket函数返回值
    				
    				struct sockaddr_in addr;
    				addr.sinfamily = AF_INET;
    				addr.sin_port = htons(8888);
    				addr.sin_addr.s_addr = htonl(INADDR_ANY); //系统自行选择IP
    				inet_pton(AF_INET,"10.219.10.193",(void*)&addr_s.sin_addr); //指定IP
    		addr:(struct sockaddr *)&addr	
    		addrlen:sizeof(addr)
    4.RETURN VALUE
           On success, zero is returned.  
           On error, -1 is returned, and errno is set appropriately.
    
  3. listen

    //设置同时与服务器建立连接的上线数 (同时进行三次握手的客户端数量)
    
    man 2 listen
    
    1.NAME
           listen - listen for connections on a socket
    
    2.SYNOPSIS
           #include <sys/types.h>          /* See NOTES */
           #include <sys/socket.h>
    
           int listen(int sockfd, int backlog);
    3.PARAMETER
    		sockfd: socket 函数返回值
    		backlog:上线数。最大值为 128
    4.RETURN VALUE
           On success, zero is returned.  
           On error, -1 is returned, and errno is set appropriately.		
    
  4. accept

    //阻塞等待客户端连接
    
    man 2 accept
    
    1.NAME
           accept, accept4 - accept a connection on a socket
    
    2.SYNOPSIS
           #include <sys/types.h>          /* See NOTES */
           #include <sys/socket.h>
    
           int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    3.PARAMETER
    		sockfd  :socket函数返回值(也必须是listen过的fd)
    		addr	:值结果参数。传出成功与服务器建立连接的客户端地址结构 
    		addrlen	:传入传出参数。
    				 传入:传入时addr的大小。一般为:sizeof(addr)
    				 传出:客户端addr的实际大小。
    4.RETURN VALUE
           On success, these system calls return a nonnegative integer that is a file descriptor for the accepted socket.  
           On error, -1 is  returned,  errno is set appropriately, and addrlen is left unchanged.
    
  5. connect

    //使用创建的socket与服务器连接
    
    man 2 connect
    
    1.NAME
           connect - initiate a connection on a socket
    
    2.SYNOPSIS
           #include <sys/types.h>          /* See NOTES */
           #include <sys/socket.h>
    
           int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    3.PARAMETER
    		sockfd	:socket函数返回值
    		
    				struct sockaddr_in addr; 
    				addr.sin_family = AF_INET;
    				addr.sin_port = htons(atoi(argv[2])); 
    				inet_pton(AF_INET,argv[1],&addr.sin_addr.s_addr);
    		addr	:传入参数。服务器地址结构。(也就是要连接的服务器的地址结构) 用inet_pton()给地址赋值。
    		addrlen	:服务器地址结构大小。
    4.RETURN VALUE
           If the connection or binding succeeds, zero is returned.  
           On error, -1 is returned, and errno is set appropriately.
    
    注: 如果connect前未使用bind显示绑定客户端地址,采用的就是“隐式绑定”。
    
  6. 实现简单的服务器和客户端DEMO

    DEMO流程如下图所示:在这里插入图片描述

DEMO:
	https://github.com/Panor520/LinuxCode/tree/master/socket/tcp/simpledemo

七、UDP网络编程涉及函数及DEMO

  1. socket
    同 tcp中的socket

  2. recvfrom

    man 2 recvfrom
    
    1.NAME
           recv, recvfrom, recvmsg - receive a message from a socket
    
    2.SYNOPSIS
           #include <sys/types.h>
           #include <sys/socket.h>
    
           ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    
           ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
    
    3.PARAMETER
    		sockfd	:通信的套接字
    		buf		:缓冲区地址 //char buf[1024];
    		len		:缓冲区大小	//sizeof(buf)
    		flags	: 默认0.
    		src_addr:(struct addr*)&addr_c 传出,对端地址结构	//不需要对端地址信息可置 0
    		addrlen	:传入传出参数。 socklen_t len_addr_c;    //不需要对端地址信息可置 0
    4.RETURN VALUE
    		成功	:成功接收数据字节数。
    		失败	:-1 errno
    		0		:对端关闭。
    
  3. sendto

man 2 sendto

1.NAME
       send, sendto, sendmsg - send a message on a socket

2.SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t send(int sockfd, const void *buf, size_t len, int flags);

       ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
       
3.PARAMETER
		sockfd	:通信的套接字
		buf		:缓冲区地址 //char buf[1024];
		len		:缓冲区大小	//sizeof(buf)
		flags	:默认0.
		dest_addr:(struct addr*)&addr 传入,对端地址结构
		addrlen	:sizeof(addr).
		
4.RETURN VALUE
		成功	:成功写如数据字节数
		失败	:-1. errno
  1. UDP通信DEMO
    server连接地址
    client连接地址

八、优化——自定义封装通讯函数

在这里插入图片描述
在这里插入图片描述

八、read函数返回值(必须掌握)

read函数返回值:
		>0	:实际读到的字节数
		=0	:已经读到结尾(对端已经关闭)【重!点!,必须掌握】
		-1	:进一步判断errno的值
				errno = EAGAIN or EWOULDBLOCK : 设置了非阻塞方式 读。没有数据到达
				errno = EINTR 慢速系统调用被 中断。
				errno = “其他情况” 异常。

九、多进程并发服务器

连接地址

十、多线程并发服务器

连接地址

十一、服务端端口和地址复用(设置套接字选项避免2MSL时长报错问题)

先关闭服务端,主动关闭端就会经历 TIMEWAIT 状态(2MSL时长),立即再次启动服务端时会出现bind server error的错误,
可以用下面方法避免。 

详见 unix网络编程 第7章

man setsockopt

先前关闭的服务端还在经历 TIMEWAIT状态,只是 端口和地址可以复用。

用法:
	在服务端的socket()bind()调用之间插入如下代码:
	
	int opt = 1;
	setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

十二、close和shutdown区别

当使用dup2()指定多个整数指向同一个文件描述符时:
	close() 关闭只会关闭指定的那个。【单个关闭】
	shutdown()关闭时,会将所有指向该文件描述符的连接全部关闭。【全关闭】

man 2 shutdown
1.NAME
       shutdown - shut down part of a full-duplex connection

2.SYNOPSIS
       #include <sys/socket.h>

       int shutdown(int sockfd, int how);
3.PARAMETERS
		how:
			SHUT_RD 关读端
			SHUT_WR 关写端
			SHUT_RDWR 两端都关闭
4.RETURN VALUE
       On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.

十三、多路I/O转接 服务器(select、poll)

  1. 基础

    传统的 多线程和多进程服务器 就是是【阻塞】的。
    而 多路I/O转接(select、poll、epoll) 是【非阻塞】的。
    
    多路I/O转接 是由内核提供的 select、poll、epoll 监听机制。
    监听connect 事件及 read、write事件。只有当 client 发生相应事件时,多路转接实现的服务器才会响应。 平时是非阻塞的(不会一直等待)。
    
    select的实现如下图所示:
    

在这里插入图片描述

  1. select

    man 2 select
    
    1.NAME
           select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing
    
    2.SYNOPSIS
           /* According to POSIX.1-2001, POSIX.1-2008 */
           #include <sys/select.h>
    
           /* According to earlier standards */
           #include <sys/time.h>
           #include <sys/types.h>
           #include <unistd.h>
    
           int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
    
           void FD_CLR(int fd, fd_set *set);  	//将一个文件描述符从集合中清除
           int  FD_ISSET(int fd, fd_set *set);	//判断一个文件描述符是否在集合中
           void FD_SET(int fd, fd_set *set);	//将一个文件描述符添加到描述符集合中
           void FD_ZERO(fd_set *set);			//清空文件描述符集合
    
    3.PARAMETER
    	nfds	:监听的所有文件描述符中,最大文件描述符+1//例:要监听 4~50的文件描述符(47), nfds就应该填 48
    	readfds	:读 文件描述符监听集合。		传入 传出 参数。 
    			  传入:要设置读监听的文件描述符集合
    			  传出:发生了读事件的文件描述符集合
    			  //例:传入集合中有4、5、6文件描述符。而4文件描述符发生了读事件,故传出的集合中只存在文件描述符4。
    	writefds:写 文件描述符监听集合。		传入 传出参数
    			  传入:要设置写监听的文件描述符集合
    			  传出:发生了写时间的文件描述符集合
    			  //例:传入集合中有4、5、6文件描述符。而5文件描述符发生了写事件,故传出的集合中只存在文件描述符5。
    	exceptfds:异常 文件描述符集合。		传入  传出  参数。
    			  传入:要设置异常监听的文件描述符集合
    			  传出:发生了异常事件 的文件描述符集合
    			  //例:传入集合中有4、5、6文件描述符。而6文件描述符发生了异常事件,故传出的集合中只存在文件描述符6。
    	timeout:	>0	:设置监听时长
    				NULL:阻塞监听(也就是始终等待事件发生)
    				0	:非阻塞监听,轮询
    	
    4.fd_set
    		是一个位图。 0 1表示。
    	
    5.RETURN VALUE
    		>0	:所有监听集合(3个)中,所有传出集合的文件描述符的总数。
    			  //例:以上面参数的例子为例,三个集合共传出了4、5、6故RETURN VALUE=3.
    		=0	:没有满足监听条件的文件描述符
    		=-1	:ERROR. errno.	
    

    select服务器DEMO思路分析:
    在这里插入图片描述
    基础select demo实现链接
    升级版select demo实现链接

    select
    缺点监听上限受文件描述符限制,最大 1024。检测满足条件的fd,需自己增加业务逻辑提高效率,也是变向增加了编码难度
    优点跨平台。可在 windowns、linux、macOS、Unix、类Unix、mips 上运行
  2. poll

    poll 就是升级版select (增加数组记录要遍历的文件描述符)
    
    man poll 
    
    1.NAME
           poll, ppoll - wait for some event on a file descriptor
    
    2.SYNOPSIS
           #include <poll.h>
    
           int poll(struct pollfd *fds, nfds_t nfds, int timeout);
    3.PARAMETER
    		fds	:监听的文件描述符【数组】
    					 struct pollfd {
    		               int   fd;         /* file descriptor */ //待监听的文件描述符
    		               short events;     /* requested events */ //待监听的文件描述符对应的监听事件
    		               short revents;    /* returned events */ //传入0。如果满足events给定的事件,会返回events对应的传入值。
    		           };
    		           events 或 revents 取值: POLLIN	//读事件
    		           							POLLOUT	//写事件
    		           							POLLERR	//错误事件
         	nfds:监听数组的 实际有效监听个数。
         	timeout: >0	:超时时长。 单位:毫秒。
         			 -1 :阻塞等待。
         			 0	:不阻塞。
    4.RETURN VALUE
    		满足对应监听事件的文件描述符 【总个数】。
    

    poll demo实现链接

    poll
    缺点不能跨平台。只能在Linux或类Unix上运行。 不能直接定位到满足事件的文件描述符,也是变向增加了编码难度
    优点自带数组结构。可以将 监听事件集合 和 返回事件集合 分离。 可拓展 监听上线(方法同epoll)(超出1024限制)

十四、epoll

  1. 基础

    epoll的本质是一个【红黑树】。监听结点为根节点。
    
    	epoll的使用由三个函数组成。
    	//epoll 应该使用非阻塞的ET模式写服务器程序(这是规则)
    	
    	man epoll_create
    	man epoll_ctl
    	man epoll_wait
    	
    	1.epoll_create() //创建一棵监听红黑树
    			1)NAME
    			       epoll_create, epoll_create1 - open an epoll file descriptor
    			
    			2)SYNOPSIS
    			       #include <sys/epoll.h>
    			
    			       int epoll_create(int size);
    			3)PARAMETER
    					size:创建红黑树的监听结点数量 (仅供内核初始化使用,当实际使用超出该大小时,内核会自动扩容)
    			4)RETURN VALUE
    					On success, these system calls return a nonnegative file descriptor.  
    					On error, -1 is returned, and errno is set to indicate the error.
    	
    	2.epoll_ctl() //操作监听红黑树
    			1)NAME
    			       epoll_ctl - control interface for an epoll file descriptor
    			
    			2)SYNOPSIS
    			       #include <sys/epoll.h>
    			
    			       int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
    			3)PARAMETER
    					1.epfd	:epoll_create()函数的返回值
    					2.op		:对该监听红黑树所做的操作。有三种值:
    									EPOLL_CTL_ADD //添加 fd 到监听红黑树
    									EPOLL_CTL_MOD //修改 fd 在监听红黑树上的监听事件
    									EPOLL_CTL_DEL //将一个 fd 从监听红黑树上摘下(取消监听)
    					3.fd		:待 op 操作的fd
    					4.event	:本质为 struct epoll_event 结构体 指针。
    									struct epoll_event {
    						               	uint32_t     events;      /* Epoll events */
    						               	epoll_data_t data;        /* User data variable */
    						           	};
    									成员 events 常用值:
    														EPOLLIN
    														EPOLLOUT
    														EPOLLERR
    									成员 data 原型如下:
    							           	typedef union epoll_data {
    								               void        *ptr;
    								               int          fd; //对应监听事件的fd
    								               uint32_t     u32;//不用
    								               uint64_t     u64;//不用
    								           } epoll_data_t;
    			4)RETURN VALUE
    					When successful, epoll_ctl() returns zero.  
    					When an error occurs, epoll_ctl() returns -1 and errno is set appropriately.
    	
    	3.epoll_wait()	//阻塞监听红黑树
    			1)NAME
    			       epoll_wait, epoll_pwait - wait for an I/O event on an epoll file descriptor
    			
    			2)SYNOPSIS
    			       #include <sys/epoll.h>
    			
    			       int epoll_wait(int epfd, struct epoll_event *events,
    			                      int maxevents, int timeout);					
    			3)PARAMETER
    					1.epfd	:epoll_create()函数的返回值
    					2.events	:传出参数(数组),满足定义的监听事件的所有结点的结构体数组
    					3.maxevents:events 数组元素的总个数。 默认为1024struct epoll_event events[1024];
    					4.timeout	: -1	:阻塞
    							   0	:不阻塞
    							   -1	:失败 errno.					
    			4)RETURN VALUE
    			       >0	:满足监听事件的struct epoll_event结构体的总个数。可用作循环处理的上线。
    			       0	:没有满足监听事件的struct epoll_event结构体
    			       -1	:失败 errno
    
    epoll
    缺点
    优点

    基础epoll demo实现链接

  2. epoll 事件模型

    	ET 模式: 	   (服务器常用方式)		
    			即边沿触发。 
    				缓冲区剩余未读尽的数据不会导致 epoll_wait 返回。新的事件满足才会触发。
    				设置方式:struct epoll_event event;
    						 event.events = EPOLLIN | EPOLLET;
    				注意: ET模式只支持非阻塞。需给连接的文件描述符设置读写非阻塞(利用fcntl函数),如下:
    						epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &event);
    						int flg = fcntl(cfd, F_GETFL);
    						flg |= O_NONBLOCK; //位或操作
    						fcntl(cfd, F_SETFL, flg);
    											
    
    	LT 模式:
    			即水平触发。 ---epoll默认采用方式
    					缓冲区剩余未读尽的数据会导致 epoll_wait 返回。 
    
    
    例:通信时,readn 读数据时,每次只读 100字节,但缓冲区接收了 250 字节。
    	① 默认的 LT模式下 会直接 再次触发 epoll_wait()函数,表明该连接fd又有数据写过来,并再读出100字节,
    		之后再次触发 epoll_wait()函数,表明又有数据写过来,接收50字节后会阻塞在readn的地方,直到写满100字节。
    		一旦 阻塞在readn的地方,代码就会有问题,因为应该阻塞在epoll_wait()的地方。
    	② 在 ET模式下,剩下的150字节会被读取忽略,不会触发 epoll_wait()函数,而下次在写入数据时,会再从之前的150字节里读前100字节,后面的新写入的数据累加进来,等待下次在读取100字节。
    

    【总结:应使用非阻塞的 ET模式写epoll服务器。】

  3. epoll 反应堆

    就是epoll基础demo的升级版,更完整些。
    也是libevent 框架采用的方式。
    
    epoll反应堆:
    			ET模式 + 非阻塞、轮询 + void *ptr. 
    
    			简单的 epoll demo:
    				socket、bind、listen	--	epoll_create 创建监听红黑树	-- 返回 epfd	--  epoll_ctl() 向树上添加一个监听fd	--
    				--	while(1)	--	epoll_wait 监听	--	对应监听fd有事件产生 -- 返回监听满足数组。 --	判断返回数组元素	--
    				--	lfd满足 --  Accept	--	cfd满足	-- read -- 小--大 -		【diff content】	- write回去。
    		
    			反应堆:
    				反应堆的优化就是在检测到对端有数据传输过来后,服务端写回时要检测,对端是否可写,确认可写再将数据写过去。
    				
    				
    				socket、bind、listen	--	epoll_create 创建监听红黑树	-- 返回 epfd	--  epoll_ctl() 向树上添加一个监听fd	--
    				--	while(1)	--	epoll_wait 监听	--	对应监听fd有事件产生 -- 返回监听满足数组。 --	判断返回数组元素	--
    				--	lfd满足 --  Accept	--	cfd满足	-- read -- 小--大 --   【diff begin】
    				
    				--	cfd从监听红黑树上摘下	--	EPOLLOUT	--	回调函数	--epoll_ctl()	-- EPOLL_CTL_ADD重新放到红黑树上监听 --
    				--	等待	epoll_wait() 返回	-- 说明 cfd 可写 -- write写回去
    				--	cfd 从监听红黑树上摘下	--	EPOLLIN | EPOLLET	--	epoll_ctl()	--	EPOLL_CTL_ADD	重新放到红黑上监听读事件	--	epoll_wait()监听		【diff end】
    

    反应堆epoll demo实现链接

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
 第1章 UNIX基础知识 1   1.1 引言 1   1.2 UNIX体系结构 1   1.3 登录 1   1.4 文件和目录 3   1.5 输入和输出 6   1.6 程序和进程 8   1.7 出错处理 10   1.8 用户标识 12   1.9 信号 14   1.10 时间值 15   1.11 系统调用和库函数 16   1.12 小结 17   习题 18   第2章 UNIX标准化及实现 19   2.1 引言 19   2.2 UNIX标准化 19   2.2.1 ISO C 19   2.2.2 IEEE POSIX 20   2.2.3 Single UNIX Specification 25   2.2.4 FIPS 26   2.3 UNIX系统实现 26   2.3.1 SVR4 26   2.3.2 4.4BSD 27   2.3.3 FreeBSD 27   2.3.4 Linux 27   2.3.5 Mac OS X 28   2.3.6 Solaris 28   2.3.7 其他UNIX系统 28   2.4 标准和实现的关系 28   2.5 限制 29   2.5.1 ISO C限制 29   2.5.2 POSIX限制 30   2.5.3 XSI限制 32   2.5.4 sysconf、pathconf和fpathconf函数 32   2.5.5 不确定的运行时限制 38   2.6 选项 42   2.7 功能测试宏 44   2.8 基本系统数据类型 45   2.9 标准之间的冲突 45   2.10 小结 46   习题 46   第3章 文件I/O 47   3.1 引言 47   3.2 文件描述符 47   3.3 open函数 48   3.4 creat函数 49   3.5 close函数 50   3.6 lseek函数 50   3.7 read函数 53   3.8 write函数 54   3.9 I/O的效率 54   3.10 文件共享 56   3.11 原子操作 59   3.12 dup和dup2函数 60   3.13 sync、fsync和fdatasync函数 61   3.14 fcntl函数 62   3.15 ioctl函数 66   3.16 /dev/fd 67   3.17 小结 68   习题 68   第4章 文件和目录 71   4.1 引言 71   4.2 stat、fstat和lstat函数 71   4.3 文件类型 72   4.4 设置用户ID和设置组ID 74   4.5 文件访问权限 75   4.6 新文件和目录的所有权 77   4.7 access函数 77   4.8 umask函数 79   4.9 chmod和fchmod函数 81   4.10 粘住位 83   4.11 chown、fchown和lchown函数 84   4.12 文件长度 85   4.13 文件截短 86   4.14 文件系统 86   4.15 link、unlink、remove和rename函数 89   4.16 符号链接 91   4.17 symlink和readlink函数 94   4.18 文件的时间 94   4.19 utime函数 95   4.20 mkdir和rmdir函数 97   4.21 读目录 98   4.22 chdir、fchdir和getcwd函数 102   4.23 设备特殊文件 104   4.24 文件访问权限位小结 106   4.25 小结 106   习题 107   第5章 标准I/O库 109   5.1 引言 109   5.2 流和FILE对象 109   5.3 标准输入、标准输出和标准出错 110   5.4 缓冲 110   5.5 打开流 112   5.6 读和写流 114   5.7 每次一行I/O 116   5.8 标准I/O的效率 117   5.9 二进制I/O 119   5.10 定位流 120   5.11 格式化I/O 121   5.12 实现细节 125   5.13 临时文件 127   5.14 标准I/O的替代软件 130   5.15 小结 130   习题 130   第6章 系统数据文件和信息 133   6.1 引言 133   6.2 口令文件 133   6.3 阴影口令 136   6.4 组文件 137   6.5 附加组ID 138   6.6 实现的区别 139   6.7 其他数据文件 139   6.8 登录账户记录 140   6.9 系统标识 141   6.10 时间和日期例程 142   6.11 小结 146   习题 146   第7章 进程环境 147   7.1 引言 147   7.2 main函数 147   7.3 进程终止 147   7.4 命令行参数 151   7.5 环境表 152   7.6 C程序的存储空间布局 152   7.7 共享库 154   7.8 存储器分配 154   7.9 环境变量 157   7.10 setjmp和longjmp函数 159   7.11 getrlimit和setrlimit函数 164   7.12 小结 168   习题 168   第8章 进程控制 171   8.1 引言 171   8.2 进程标识符 171   8.3 fork函数 172   8.4 vfork函数 176   8.5 exit函数 178   8.6 wait和waitpid函数 179   8.7 waitid函数 183   8.8 wait3和wait4函数 184   8.9 竞争条件 185   8.10 exec函数 188   8.11 更改用户ID和组ID 192   8.12 解释器文件 196   8.13 system函数 200   8.14 进程会计 203   8.15 用户标识 208   8.16 进程时间 208   8.17 小结 210   习题 211   第9章 进程关系 213   9.1 引言 213   9.2 终端登录 213   9.3 网络登录 216   9.4 进程组 218   9.5 会话 219   9.6 控制终端 220   9.7 tcgetpgrp、tcsetpgrp和tcgetsid函数 221   9.8 作业控制 222   9.9 shell执行程序 225   9.10 孤儿进程组 228   9.11 FreeBSD实现 230   9.12 小结 231   习题 232   第10章 信号 233   10.1 引言 233   10.2 信号概念 233   10.3 signal函数 240   10.4 不可靠的信号 242   10.5 中断的系统调用 244   10.6 可重入函数 246   10.7 SIGCLD语义 248   10.8 可靠信号术语和语义 250   10.9 kill和raise函数 251   10.10 alarm和pause函数 252   10.11 信号集 256   10.12 sigprocmask函数 258   10.13 sigpending函数 259   10.14 sigaction函数 261   10.15 sigsetjmp和siglongjmp函数 266   10.16 sigsuspend函数 268   10.17 abort函数 274   10.18 system函数 276   10.19 sleep函数 280   10.20 作业控制信号 282   10.21 其他特征 284   10.22 小结 285   习题 285   第11章 线程 287   11.1 引言 287   11.2 线程概念 287   11.3 线程标识 288   11.4 线程的创建 288   11.5 线程终止 291   11.6 线程同步 297   11.7 小结 311   习题 311   第12章 线程控制 313   12.1 引言 313   12.2 线程限制 313   12.3 线程属性 314   12.4 同步属性 318   12.5 重入 324   12.6 线程私有数据 328   12.7 取消选项 331   12.8 线程和信号 333   12.9 线程和fork 336   12.10 线程和I/O 339   12.11 小结 340   习题 340   第13章 守护进程 341   13.1 引言 341   13.2 守护进程的特征 341   13.3 编程规则 342   13.4 出错记录 345   13.5 单实例守护进程 348   13.6 守护进程的惯例 350   13.7 客户进程-服务器进程模型 354   13.8 小结 354   习题 354   第14章 高级I/O 355   14.1 引言 355   14.2 非阻塞I/O 355   14.3 记录锁 357   14.4 STREAMS 370   14.5 I/O多路转接 379   14.5.1 select和pselect函数 381   14.5.2 poll函数 384   14.6 异步I/O 386   14.6.1 系统V异步I/O 386   14.6.2 BSD异步I/O 387   14.7 readv和writev函数 387   14.8 readn和writen函数 389   14.9 存储映射I/O 390   14.10 小结 395   习题 396   第15章 进程间通信 397   15.1 引言 397   15.2 管道 398   15.3 popen和pclose函数 403   15.4 协同进程 408   15.5 FIFO 412   15.6 XSI IPC 415   15.6.1 标识符和键 415   15.6.2 权限结构 416   15.6.3 结构限制 417   15.6.4 优点和缺点 417   15.7 消息队列 418   15.8 信号量 422   15.9 共享存储 427   15.10 客户进程-服务器进程属性 432   15.11 小结 434   习题 434   第16章 网络IPC:套接字 437   16.1 引言 437   16.2 套接字描述符 437   16.3 寻址 439   16.3.1 字节序 440   16.3.2 地址格式 441   16.3.3 地址查询 442   16.3.4 将套接字与地址绑定 449   16.4 建立连接 450   16.5 数据传输 452   16.6 套接字选项 464   16.7 带外数据 466   16.8 非阻塞和异步I/O 467   16.9 小结 468   习题 468   第17章 高级进程间通信 469   17.1 引言 469   17.2 基于STREAMS的管道 469   17.2.1 命名的STREAMS管道 472   17.2.2 唯一连接 473   17.3 UNIX域套接字 476   17.3.1 命名UNIX域套接字 477   17.3.2 唯一连接 478   17.4 传送文件描述符 482   17.4.1 经由基于STREAMS的管道传送文件描述符 484   17.4.2 经由UNIX域套接字传送文件描述符 486   17.5 open服务器版本1 493   17.6 open服务器版本2 498   17.7 小结 505   习题 505   第18章 终端I/O 507   18.1 引言 507   18.2 综述 507   18.3 特殊输入字符 512   18.4 获得和设置终端属性 516   18.5 终端选项标志 516   18.6 stty命令 522   18.7 波特率函数 523   18.8 行控制函数 524   18.9 终端标识 524   18.10 规范模式 529   18.11 非规范模式 532   18.12 终端的窗口大小 537   18.13 termcap,terminfo和curses 539   18.14 小结 540   习题 540   第19章 伪终端 541   19.1 引言 541   19.2 概述 541   19.3 打开伪终端设备 544   19.3.1 基于STREAMS的伪终端 547   19.3.2 基于BSD的伪终端 549   19.3.3 基于Linux的伪终端 551   19.4 pty_fork函数 553   19.5 pty程序 555   19.6 使用pty程序 559   19.7 高级特性 564   19.8 小结 565   习题 565   第20章 数据库函数库 567   20.1 引言 567   20.2 历史 567   20.3 函数库 568   20.4 实现概述 569   20.5 集中式或非集中式 572   20.6 并发 574   20.7 构造函数库 574   20.8 源代码 575   20.9 性能 598   20.10 小结 600   习题 601   第21章 与网络打印机通信 603   21.1 引言 603   21.2 网络打印协议 603   21.3 超文本传输协议 605   21.4 打印假脱机技术 605   21.5 源代码 607   21.6 小结 644   习题 645   附录A 函数原型 647   附录B 其他源代码 677   附录C 部分习题答案 685   参考书目 709
本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的第2版。在 本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变 化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技 术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程 关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在 此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附 录中给出了函数原型和部分习题的答案。 本书内容权威,概念清晰,阐述精辟,对于所有层次UNIX/Linux程序员都是一本不可或缺的参考书。 第1章UNIX基础知识1 1.1 引言1 1.2 UNIX体系结构1 1.3 登录1 1.4 文件和目录3 1.5 输入和输出6 1.6 程序和进程8 1.7 出错处理10 1.8 用户标识12 1.9 信号14 1.10 时间值15 1.11 系统调用和库函数16 1.12 小结17 习题18 第2章UNIX标准化及实现19 2.1 引言19 2.2 UNIX标准化19 2.2.1 ISO C 19 2.2.2 IEEE POSIX 20 2.2.3 Single UNIX Specification 25 .2.2.4 FIPS 26 2.3 UNIX系统实现26 2.3.1 SVR4 26 2.3.2 4.4BSD 27 2.3.3 FreeBSD 27 2.3.4 Linux 27 2.3.5 Mac OS X 28 2.3.6 Solaris 28 2.3.7 其他UNIX系统28 2.4 标准和实现的关系28 2.5 限制29 2.5.1 ISO C限制29 2.5.2 POSIX限制30 2.5.3 XSI限制32 2.5.4 sysconf、pathconf和fpathconf 函数32 2.5.5 不确定的运行时限制38 2.6 选项42 2.7 功能测试宏44 2.8 基本系统数据类型45 2.9 标准之间的冲突45 2.10 小结46 习题46 第3章文件I/O 47 3.1 引言47 3.2 文件描述符47 3.3 open函数48 3.4 creat函数49 3.5 close函数50 3.6 lseek函数50 3.7 read函数53 3.8 write函数54 3.9 I/O的效率54 3.10 文件共享56 3.11 原子操作59 3.12 dup和dup2函数60 3.13 sync、fsync和fdatasync函数61 3.14 fcntl函数62 3.15 ioctl函数66 3.16 /dev/fd 67 3.17 小结68 习题68 第4章文件和目录71 4.1 引言71 4.2 stat、fstat和lstat函数71 目录 4.3 文件类型72 4.4 设置用户ID和设置组ID 74 4.5 文件访问权限75 4.6 新文件和目录的所有权77 4.7 access函数77 4.8 umask函数79 4.9 chmod和fchmod函数81 4.10 粘住位83 4.11 chown、fchown和lchown函数84 4.12 文件长度85 4.13 文件截短86 4.14 文件系统86 4.15 link、unlink、remove和rename 函数89 4.16 符号链接91 4.17 symlink和readlink函数94 4.18 文件的时间94 4.19 utime函数95 4.20 mkdir和rmdir函数97 4.21 读目录98 4.22 chdir、fchdir和getcwd函数102 4.23 设备特殊文件104 4.24 文件访问权限位小结106 4.25 小结106 习题107 第5章标准I/O库109 5.1 引言109 5.2 流和FILE对象109 5.3 标准输入、标准输出和标准出错110 5.4 缓冲110 5.5 打开流112 5.6 读和写流114 5.7 每次一行I/O 116 5.8 标准I/O的效率117 5.9 二进制I/O 119 5.10 定位流120 5.11 格式化I/O 121 5.12 实现细节125 5.13 临时文件127 5.14 标准I/O的替代软件130 5.15 小结130 习题130 第6章系统数据文件和信息133 6.1 引言133 6.2 口令文件133 6.3 阴影口令136 6.4 组文件137 6.5 附加组ID138 6.6 实现的区别139 6.7 其他数据文件139 6.8 登录账户记录140 6.9 系统标识141 6.10 时间和日期例程142 6.11 小结146 习题146 第7章进程环境147 7.1 引言147 7.2 main函数147 7.3 进程终止147 7.4 命令行参数151 7.5 环境表152 7.6 C程序的存储空间布局152 7.7 共享库154 7.8 存储器分配154 7.9 环境变量157 7.10 setjmp和longjmp函数159 7.11 getrlimit和setrlimit函数164 7.12 小结168 习题168 第8章进程控制171 8.1 引言171 8.2 进程标识符171 8.3 fork函数172 8.4 vfork函数176 8.5 exit函数178 8.6 wait和waitpid函数179 8.7 waitid函数183 8.8 wait3和wait4函数184 8.9 竞争条件185 8.10 exec函数188 2 目录 8.11 更改用户ID和组ID 192 8.12 解释器文件196 8.13 system函数200 8.14 进程会计203 8.15 用户标识208 8.16 进程时间208 8.17 小结210 习题211 第9章进程关系213 9.1 引言213 9.2 终端登录213 9.3 网络登录216 9.4 进程组218 9.5 会话219 9.6 控制终端220 9.7 tcgetpgrp、tcsetpgrp和tcgetsid 函数221 9.8 作业控制222 9.9 shell执行程序225 9.10 孤儿进程组228 9.11 FreeBSD实现230 9.12 小结231 习题232 第10章信号233 10.1 引言233 10.2 信号概念233 10.3 signal函数240 10.4 不可靠的信号242 10.5 中断的系统调用244 10.6 可重入函数246 10.7 SIGCLD语义248 10.8 可靠信号术语和语义250 10.9 kill和raise函数251 10.10 alarm和pause函数252 10.11 信号集256 10.12 sigprocmask函数258 10.13 sigpending函数259 10.14 sigaction函数261 10.15 sigsetjmp和siglongjmp函数266 10.16 sigsuspend函数268 10.17 abort函数274 10.18 system函数276 10.19 sleep函数280 10.20 作业控制信号282 10.21 其他特征284 10.22 小结285 习题285 第11章线程287 11.1 引言287 11.2 线程概念287 11.3 线程标识288 11.4 线程的创建288 11.5 线程终止291 11.6 线程同步297 11.7 小结311 习题311 第12章线程控制313 12.1 引言313 12.2 线程限制313 12.3 线程属性314 12.4 同步属性318 12.5 重入324 12.6 线程私有数据328 12.7 取消选项331 12.8 线程和信号333 12.9 线程和fork 336 12.10 线程和I/O 339 12.11 小结340 习题340 第13章守护进程341 13.1 引言341 13.2 守护进程的特征341 13.3 编程规则342 13.4 出错记录345 13.5 单实例守护进程348 13.6 守护进程的惯例350 13.7 客户进程-服务器进程模型354 13.8 小结354 目录  3 习题354 第14章高级I/O355 14.1 引言355 14.2 非阻塞I/O 355 14.3 记录锁357 14.4 STREAMS 370 14.5 I/O多路转接379 14.5.1 select和pselect函数381 14.5.2 poll函数384 14.6 异步I/O 386 14.6.1 系统V异步I/O 386 14.6.2 BSD异步I/O 387 14.7 readv和writev函数387 14.8 readn和writen函数389 14.9 存储映射I/O 390 14.10 小结395 习题396 第15章进程间通信397 15.1 引言397 15.2 管道398 15.3 popen和pclose函数403 15.4 协同进程408 15.5 FIFO 412 15.6 XSI IPC 415 15.6.1 标识符和键415 15.6.2 权限结构416 15.6.3 结构限制417 15.6.4 优点和缺点417 15.7 消息队列418 15.8 信号量422 15.9 共享存储427 15.10 客户进程-服务器进程属性432 15.11 小结434 习题434 第16章网络IPC:套接字437 16.1 引言437 16.2 套接字描述符437 16.3 寻址439 16.3.1 字节序440 16.3.2 地址格式441 16.3.3 地址查询442 16.3.4 将套接字与地址绑定449 16.4 建立连接450 16.5 数据传输452 16.6 套接字选项464 16.7 带外数据466 16.8 非阻塞和异步I/O 467 16.9 小结468 习题468 第17章高级进程间通信469 17.1 引言469 17.2 基于STREAMS的管道469 17.2.1 命名的STREAMS管道472 17.2.2 唯一连接473 17.3 UNIX域套接字476 17.3.1 命名UNIX域套接字477 17.3.2 唯一连接478 17.4 传送文件描述符482 17.4.1 经由基于STREAMS的管道传送 文件描述符484 17.4.2 经由UNIX域套接字传送文件 描述符486 17.5 open服务器版本1 493 17.6 open服务器版本2 498 17.7 小结505 习题505 第18章终端I/O507 18.1 引言507 18.2 综述507 18.3 特殊输入字符512 18.4 获得和设置终端属性516 18.5 终端选项标志516 18.6 stty命令522 18.7 波特率函数523 18.8 行控制函数524 18.9 终端标识524 18.10 规范模式529 18.11 非规范模式532 18.12 终端的窗口大小537 18.13 termcap,terminfo和curses 539 4 目录 18.14 小结540 习题540 第19章伪终端541 19.1 引言541 19.2 概述541 19.3 打开伪终端设备544 19.3.1 基于STREAMS的伪终端547 19.3.2 基于BSD的伪终端549 19.3.3 基于Linux的伪终端551 19.4 pty_fork函数553 19.5 pty程序555 19.6 使用pty程序559 19.7 高级特性564 19.8 小结565 习题565 第20章数据库函数库567 20.1 引言567 20.2 历史567 20.3 函数库568 20.4 实现概述569 20.5 集中式或非集中式572 20.6 并发574 20.7 构造函数库574 20.8 源代码575 20.9 性能598 20.10 小结600 习题601 第21章与网络打印机通信603 21.1 引言603 21.2 网络打印协议603 21.3 超文本传输协议605 21.4 打印假脱机技术605 21.5 源代码607 21.6 小结644 习题645 附录A 函数原型647 附录B 其他源代码677 附录C 部分习题答案685 参考书目709 索引715
本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作系统。通过本书的学习,你会成为一个Linux 操作系统的安装专家,并能使配置的机器完全按自己的意愿工作。 目 录 前言 第1章 安装Linux操作系统的准备工作 1 1.1 概述 1 1.1.1 什么是Linux操作系统 1 1.1.2 Linux操作系统的发行版本 2 1.1.3 安装Linux操作系统之前的准备工作 4 1.2 快速解决方案 5 1.2.1 使用Windows 95/98/NT查看系统 信息 5 1.2.2 查看Red Hat发行版本的硬件兼容 清单 8 1.2.3 查看Caldera发行版本的硬件兼容 清单 8 1.2.4 查找Linux操作系统的低价CD-ROM 光盘 8 1.2.5 查找关于Linux操作系统的最新新闻 9 1.2.6 确定Linux操作系统能否满足你的 工作需要 9 第2章 对硬盘驱动器进行分区 10 2.1 概述 10 2.2 快速解决方案 13 2.2.1 使用FIPS程序在不破坏原有数据的 前提下调整分区 13 2.2.2 使用Red Hat公司的Disk Druid 程序增加分区 14 2.2.3 使用Partition Magic程序整理硬盘 并增加分区 15 2.2.4 使用Caldera公司的Disk Partition 程序增加分区 15 第3章 安装Caldera发行版本 18 3.1 概述 18 3.1.1 安装过程 18 3.1.2 Caldera发行版本的安装选项 19 3.1.3 配置图形的考虑 20 3.1.4 安装多个操作系统: 21 3.2 快速解决方案 22 3.2.1 从CD-ROM光盘开始运行 安装程序 22 3.2.2 安装Caldera公司的Windows下的 辅助安装工具程序 22 3.2.3 确定哪些安装盘是必需的 23 3.2.4 制作安装盘 23 3.2.5 制作一张Windows下的引导盘 24 3.2.6 从软盘开始运行安装程序 25 3.2.7 为一个专用的本地网络分配IP地址 25 3.2.8 从引导管理程序失误中恢复NT 25 3.2.9 制作一张定制的Linux操作系统 引导盘 26 3.2.10 设置直接引导启动到Caldera 发行版本 26 3.2.11 直接引导启动到Caldera发行版本 27 3.2.12 诊断使用LILO程序引导启动时 出现的挂起错误 27 3.2.13 恢复主引导记录 28 3.2.14 运行LILO程序 28 3.2.15 设置LILO程序 28 3.2.16 确定磁盘参数 29 3.2.17 在LILO程序中设置用来选择某个 操作系统的启动引导延时 30 3.2.18 重新安装LILO程序 30 3.2.19 删除LILO程序 30 3.2.20 关闭系统 30 第4章 安装Red Hat发行版本 31 4.1 概述 31 4.1.1 安装过程 32 4.1.2 Red Hat发行版本的安装级别 32 4.1.3 LILO程序,Linux操作系统的加载 程序 34 4.1.4 配置显示选项的考虑 35 4.1.5 系统开机引导时可以使用的服务 35 4.1.6 安装多个操作系统 36 4.2 快速解决方案 36 4.2.1 确定哪些安装盘是必需的 36 4.2.2 制作一张Linux操作系统的安装引 导盘 37 4.2.3 下载最新的引导启动映像 37 4.2.4 制作一张Windows下的引导盘 37 4.2.5 从一张引导盘开始运行安装程序 38 4.2.6 从CD-ROM光盘开始运行安装程序 38 4.2.7 为NFS、HTTP或者FTP安装设置 一个本地服务器 39 4.2.8 为一个专用的本地网络分配IP地址 39 4.2.9 通过一个NFS挂装进行安装 39 4.2.10 从一个硬盘驱动器分区进行安装 40 4.2.11 从一个HTTP或者FTP服务器进行 安装 40 4.2.12 从引导管理程序失误中恢复NT 40 4.2.13 选择需要安装哪些组件和软件包 41 4.2.14 使用虚拟控制台跟踪和调试安装 过程 41 4.2.15 引导进入Linux操作系统 42 4.2.16 诊断使用LILO程序启动引导时 出现的挂起错误 42 4.2.17 可以用在MBR中的LILO程序的 代用程序 44 4.2.18 恢复MBR 45 4.2.19 运行LILO程序 45 4.2.20 设置LILO程序 45 4.2.21 配置LILO程序引导多个操作系统 45 4.2.22 确定磁盘参数 46 4.2.23 设置用来选择某个操作系统的 启动引导延时 47 4.2.24 在LILO程序中设置一个缺省的 操作系统 47 4.2.25 重新安装LILO程序 48 4.2.26 删除LILO程序 48 4.2.27 选择自动启用哪些服务 48 4.2.28 关闭系统 48 4.2.29 让Linux操作系统检查1GB以上的 RAM系统内存 49 第5章 使用Linux操作系统 50 5.1 概述 50 5.1.1 Linux操作系统与DOS和NT的比较 51 5.1.2 文件存取权限和所有权限 51 5.2 快速解决方案 52 5.2.1 设置日期 52 5.2.2 设置时间 52 5.2.3 列出目录的内容清单 52 5.2.4 切换目录路径 53 5.2.5 确定自己所在的位置 54 5.2.6 解读文件和目录清单列表 54 5.2.7 改变文件和目录的存取权限 54 5.2.8 改变文件和目录的所有者 55 5.2.9 给文件和目录改名 55 5.2.10 建立目录 55 5.2.11 建立链接 55 5.2.12 删除目录 56 5.2.13 拷贝文件和目录 56 5.2.14 移动文件和目录 57 5.2.15 删除文件 57 5.2.16 识别二进制文件 57 5.2.17 使用vi文本编辑器程序 57 5.2.18 使用pico文本编辑器程序 58 5.2.19 查看文本文件,不使用文本编辑器 程序 60 5.2.20 把命令结果输出到文本文件中 61 5.2.21 建立别名 61 5.2.22 使用find命令确定文件存放位置 61 5.2.23 通过搜索locate数据库来查找文件 62 5.2.24 在path语句说明的路径中查找 文件 62 5.2.25 在path语句中添加新路径 63 5.2.26 在文件内容中查找文本 63 5.2.27 寻求帮助 63 5.2.28 在后台运行命令程序 63 5.2.29 确定当前运行的命令 63 5.2.30 把命令程序调到后台去 64 5.2.31 把后台命令调回前台来 64 5.2.32 取消正在执行的命令 64 5.2.33 清除屏幕 64 5.2.34 一次执行多个命令 65 5.2.35 退出登录 65 5.2.36 重新引导启动机器 65 5.2.37 系统关机 65 第6章 配置X图形界面 66 6.1 概述 66 6.2 快速解决方案 67 6.2.1 在Caldera发行版本中配置X图形 界面的准备工作 67 6.2.2 在Caldera发行版本中配置鼠标 69 6.2.3 在Caldera发行版本中配置键盘 70 6.2.4 在Caldera发行版本中配置图形卡 71 6.2.5 在Caldera发行版本中配置显示器 73 6.2.6 在Caldera发行版本中配置图形显示 模式和颜色设置 73 6.2.7 在Caldera发行版本中配置X服务器 程序本身 74 6.2.8 在Red Hat发行版本中配置X图形 界面 75 6.2.9 在Red Hat发行版本中定制配置 一台显示器 79 6.2.10 在Red Hat发行版本中配置图形 显示模式 80 6.2.11 手动调整X图形界面 82 6.2.12 手动配置显示器 82 6.2.13 手动配置图形卡 83 6.2.14 手动配置图形显示模式 84 6.2.15 进入GUI 85 第7章 窗口管理器程序和桌面环境 86 7.1 概述 86 7.1.1 窗口管理器程序 86 7.1.2 桌面环境 87 7.2 快速解决方案 88 7.2.1 查找窗口管理器程序 88 7.2.2 在Gnome桌面环境中运行程序 88 7.2.3 在Gnome桌面环境中隐藏任务条 89 7.2.4 使用Gnome桌面环境中的帮助系统 89 7.2.5 使用Gnome桌面环境中的控制面板 90 7.2.6 在KDE桌面环境中运行程序 91 7.2.7 在KDE桌面环境中隐藏任务条 92 7.2.8 使用KDE桌面环境中的帮助系统 92 7.2.9 使用KDE桌面环境中的控制中心 93 7.2.10 在KDE桌面环境使用COAS 94 7.2.11 安装一个新的窗口管理器程序 94 第8章 建立用户帐户 96 8.1 概述 96 8.1.1 口令字 97 8.1.2 编写添加用户命令脚本程序 98 8.2 快速解决方案 98 8.2.1 添加一个新用户 98 8.2.2 添加或者修改一个口令字 98 8.2.3 通过linuxconf程序添加一个 新用户 99 8.2.4 查看关于新用户的缺省设置 100 8.2.5 选择关于新用户的缺省设置 100 8.2.6 改变关于新用户的缺省设置 101 8.2.7 修改现有用户的信息 101 8.2.8 通过linuxconf程序修改现有用户 的信息 102 8.2.9 安装shadow口令字软件包 103 8.2.10 转换用户系统使用shadow 口令字 103 8.2.11 转换用户系统不再使用shadow 口令字 103 8.2.12 查找缺省的用户配置文件 103 8.2.13 查找容易被破译的口令字 104 8.2.14 冻结一个用户 104 8.2.15 通过linuxconf程序冻结一个用户 104 8.2.16 删除一个用户 104 8.2.17 通过linuxconf程序删除一个用户 104 8.2.18 检查系统的易受攻击性 105 8.2.19 修改源代码使程序能够运行在使用 shadow口令字功能的系统中 105 8.2.20 打开linuxconf程序 105 第9章 Linux操作系统的文件系统 107 9.1 概述 107 9.1.1 文件系统基础 107 9.1.2 Linux文件系统的格式 107 9.2 快速解决方案 108 9.2.1 建立一个文件系统 108 9.2.2 挂装到文件系统上 108 9.2.3 从文件系统上卸载 109 9.2.4 简化常用挂装命令 109 9.2.5 挂装一个已经准备好的设备 类型 110 9.2.6 在开机引导启动时自动挂装一个 设备 110 9.2.7 把一个现存的目录转移到一个新 分区 111 第10章 编译系统内核 113 10.1 概述 113 10.1.1 为什么要编译 113 10.1.2 为什么不编译 114 10.1.3 内核升级问题 114 10.1.4 应该使用哪一个内核 114 10.1.5 系统内核配置选项 114 10.2 快速解决方案 115 10.2.1 确定用户正在使用的是哪个版本 的内核 115 10.2.2 确定内核是测试版还是正式版 115 10.2.3 通过发行商做好升级内核的 准备 115 10.2.4 哪里可以找到内核源代码 116 10.2.5 为新内核加上LILO选项 116 10.2.6 测试内核安装效果 116 10.2.7 使用Caldera发行版本升级内核 117 10.2.8 使用Red Hat发行版本升级内核 117 10.2.9 编译内核 118 10.2.10 升级内核 119 10.2.11 为内核源代码打补丁 119 10.2.12 对缺省内核进行细调 120 10.2.13 安装内核 121 10.2.14 加载内核模块 121 10.2.15 卸载内核模块 121 10.2.16 使用config程序 122 10.2.17 使用menuconfig程序 122 10.2.18 使用xconfig程序 124 第11章 配置LAN 127 11.1 概述 127 11.1.1 计划一个LAN 127 11.1.2 网络硬件 128 11.1.3 服务 129 11.1.4 确定用户是否需要动态 分配路由 130 11.2 快速解决方案 130 11.2.1 检查网络当前的设置情况 130 11.2.2 设置IP地址 131 11.2.3 在GUI中设置IP地址 131 11.2.4 给网络中的计算机命名 133 11.2.5 在GUI中给网络中的计算机命名 133 11.2.6 分配域名 135 11.2.7 在GUI中分配域名 135 11.2.8 设置动态路由分配 136 11.2.9 在Red Hat发行版本中设置静态路由 分配 138 11.2.10 为计算机配置域名解析 139 11.2.11 建立LAN 140 11.2.12 配置打印服务 141 11.2.13 在GUI中添加一台打印机 142 11.2.14 在GUI中修改一个打印机设置 144 11.2.15 删除一个打印机设置 145 11.2.16 在GUI中删除一个打印机设置 145 11.2.17 配置一个NFS文件服务器计算机 147 11.2.18 配置一个NFS客户计算机 148 11.2.19 确定是否需要NIS 148 11.2.20 配置NIS 148 第12章 通过Samba服务与Windows网络 集成 152 12.1 概述 152 12.2 快速解决方案 154 12.2.1 获取Samba的最新版本 154 12.2.2 检查是否已经安装了Samba 154 12.2.3 从Red Hat发行版本的CD-ROM 光盘上安装Samba软件包 154 12.2.4 从Caldera发行版本的CD-ROM 光盘上安装Samba软件包 154 12.2.5 从源代码安装Samba软件包 154 12.2.6 查看Samba守护进程是否正在 运行 155 12.2.7 配置Samba守护进程从inetd中 运行 155 12.2.8 配置Samba守护进程从系统的开机 引导脚本程序中运行 156 12.2.9 配置Samba守护进程不从系统的 开机引导脚本程序中运行 156 12.2.10 手动启动Samba守护进程运行 157 12.2.11 定义主机的Samba服务访问 权限 157 12.2.12 建立一个Samba配置文件 157 12.2.13 配置硬盘驱动器共享:Linux 到Windows 159 12.2.14 配置硬盘驱动器共享:Windows 到Linux 160 12.2.15 从一个Windows机器上测试硬盘 驱动器共享设置 161 12.2.16 从一个Linux机器上测试硬盘 驱动器共享设置 161 12.2.17 配置打印共享:Linux到 Windows 161 12.2.18 配置打印共享:Windows到 Linux 162 12.2.19 测试打印共享 163 12.2.20 访问一个Windows硬盘驱动器 163 第13章 连接到因特网 164 13.1 概述 164 13.1.1 PPP拨号程序 164 13.1.2 因特网客户程序 164 13.2 快速解决方案 165 13.2.1 连接到ISP 165 13.2.2 使用kppp设置一个PPP连接 166 13.2.3 准备编写一个登录命令脚本 170 13.2.4 在kppp中编写一个登录命令脚本 170 13.2.5 使用linuxconf程序设置一个PPP 连接 171 13.2.6 下载并安装pppsetup软件 173 13.2.7 使用pppsetup软件对PPP拨号进行 设置 173 13.2.8 从命令行拨入 177 13.2.9 从Caldera发行版本的GUI 中拨入 177 13.2.10 从Red Hat发行版本的GUI 中拨入 177 第14章 设置因特网服务 178 14.1 概述 178 14.1.1 连接性 178 14.1.2 电子邮件方面的考虑 178 14.1.3 使所做的设置修改明确生效 179 14.1.4 虚拟主机 179 14.2 快速解决方案 179 14.2.1 设置虚拟主机服务 179 14.2.2 配置电子邮件 180 14.2.3 运行POP电子邮件软件 182 14.2.4 配置Apache软件的WWW服务 功能 183 14.2.5 配置一个FTP服务器 185 14.2.6 配置NFS 186 第15章 软件包管理 188 15.1 概述 188 15.1.1 选择下载的软件包格式 188 15.1.2 软件打包方法 189 15.1.3 X Window环境中的RPM工具 190 15.2 快速解决方案 191 15.2.1 管理RPM软件包 191 15.2.2 使用tar档案文件 193 15.2.3 使用GZip压缩 195 15.2.4 建立一个压缩的tar文件 195 第16章 安装新软件 196 16.1 概述 196 16.2 快速解决方案 198 16.2.1 寻找软件包 198 16.2.2 确定源代码是否可以在你的 机器上通过编译并运行 199 16.2.3 替换制作文件 199 16.2.4 编译源代码 200 16.2.5 安装二进制代码 200 16.2.6 把软件包添加到用户的PATH 语句中 200 16.2.7 识别可执行程序 201 第17章 C语言编程工具 202 17.1 概述 202 17.1.1 C语言编程工具 202 17.1.2 Linux操作系统中的C语言编程 202 17.2 快速解决方案 203 17.2.1 安装C语言编译器 203 17.2.2 安装基本C语言函数库 203 17.2.3 安装内核函数库 203 17.2.4 安装build管理器 204 17.2.5 安装C语言预处理器 204 17.2.6 安装文件比较工具软件 204 17.2.7 安装源代码补丁修补软件 204 17.2.8 寻找专业函数库 205 17.2.9 建立一个简单的制作文件 205 第18章 编写shell命令脚本程序 207 18.1 概述 207 18.1.1 shell概述 207 18.1.2 良好的命令脚本程序编程习惯 208 18.1.3 编程示范 208 18.2 快速解决方案 210 18.2.1 编写一个命令脚本程序 210 18.2.2 给变量赋值 211 18.2.3 使用某个变量的值 211 18.2.4 提示和接受输入数据 211 18.2.5 忽略元字符 211 18.2.6 编写条件if语句 212 18.2.7 接受命令行输入 213 18.2.8 添加注释语句 213 18.2.9 添加一个帮助组件 213 18.2.10 添加一个for循环语句 214 18.2.11 添加一个while循环语句 214 18.2.12 添加一个菜单 214 18.2.13 二次检查用户输入数据 215 18.2.14 比较文件、字符串以及正则 表达式 217 18.2.15 结束一个命令脚本程序 218 18.2.16 测试一个命令脚本程序 219 18.2.17 调试一个命令脚本程序 219 第19章 Perl语言 221 19.1 概述 221 19.1.1 为什么使用Perl语言 221 19.1.2 Perl语言编程示范 222 19.2 快速解决方案 224 19.2.1 建立一个Perl程序 224 19.2.2 运行一个Perl程序 224 19.2.3 使程序输出在下一行显示 224 19.2.4 接受命令行输入 225 19.2.5 给变量赋值 225 19.2.6 使用某个变量的值 225 19.2.7 测试true或者false 225 19.2.8 测试文件 225 19.2.9 使用数学计算 226 19.2.10 数据值比较 226 19.2.11 字符串处理 227 19.2.12 使用数组 227 19.2.13 使用for语句 228 19.2.14 使用foreach语句 229 19.2.15 使用if语句 229 19.2.16 使用unless语句 230 19.2.17 使用until语句 231 19.2.18 使用while语句 231 19.2.19 把数据写入一个文件 231 19.2.20 从一个文件中读出数据 232 第20章 配置系统备份策略 233 20.1 概述 233 20.2 快速解决方案 235 20.2.1 获取ftape驱动程序 235 20.2.2 安装ftape驱动程序 236 20.2.3 选择一种备份策略 236 20.2.4 人工建立备份:通用方法 237 20.2.5 使用软盘或磁带机进行一次完全 备份 237 20.2.6 从磁带或软盘中恢复完全备份 238 20.2.7 向一个现有的tar备份文件中添加 文件 238 20.2.8 设置备份操作在指定时间执行 238 20.2.9 选择备份用的软件 239 20.2.10 自动备份 239 20.2.11 决定是否使用一个活动硬盘 驱动器系统 240 第21章 安全性问题 242 21.1 概述 242 21.2 快速解决方案 243 21.2.1 关闭简单的薄弱环节 243 21.2.2 列出成功登录的记录清单 243 21.2.3 列出不成功登录的记录清单 244 21.2.4 查找安全漏洞 244 21.2.5 密切注意系统安全性方面的进展 244 21.2.6 确定是否需要一堵防火墙 245 21.2.7 强化对网络驱动器访问的控制 246 21.2.8 过滤向外发送的数据包 246 21.2.9 安装ipchains 247 21.2.10 在重启动/关机之前保存数据 包过滤规则 248 21.2.11 开机引导后恢复数据包过滤 规则 248 21.2.12 安装SOCKS 248 21.2.13 安装代理服务器程序 249 21.2.14 配置SOCKS 249 21.2.15 设置Linux机器通过代理防火墙 250

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值