1.fork()函数和exec()函数:
- #include <unistd.h>
- pid_t fork(void);
- 返回: 在子进程中为0,在父进程中为子进程ID, -1 出错。
调用fork()会在当前进程的基础上派生出一个子进程,派生出的进程就是当前进程的子进程,当前进程就是
这个子进程的父进程。在父进程,fork()函数的返回值是派生出的子进程的进程ID,在子进程,fork()的返
回值是0.
- #include <unistd.h>
- int execl(const char* pathname,const char* arg0,***/*(char*)0*/);
- int execv(const char* pathname,char *const argv[]);
- int execle(const char*pathname,const char*arg0,.../*(char*)0,char*const envp[]*/);
- int execve(const char* pathname,char*const argv[],char* const envp[]);
- int execlp(const char* filename,const char* arg0,.../*(char*)0*/);
- int execvp(const char* filename,char* const argv[]);
- 返回:6个函数,-1 出错,无返回 成功
这个六个函数的记忆方法:
1.基本函数exec, 后缀'l' 表示list ,'v'表示vector,list就是分别列出pahtname的参数,vector就
是以数组的形式列出pathname的参数,pathname 为应用程序的完整路径加文件名。
2.基本函数exec,后缀'le'表示list env,list同上,env表示环境变量。've'表示vector env.vector
同上.
3.基本函数exec,后缀'lp'表示 list path,list同1,path指path环境变量,就是在path指定路径中
查找filename并执行。后缀'vp'表示vector path,vector 同1,path同前。
2.close()函数:
- #include <unistd.h>
- int close(int sockfd);
- 返回: 0 成功,-1 出错
TCP套接口的close其缺省功能是将套接口做上"已关闭"标记,并立即返回到进程,这个套接口描述字不能
再为进程所用: 它不能作为函数read()或者write()的参数,但TCP讲试着发送已排队待发的任何数据,然
后按正常的TCP连接终止序列操作。
3.getsockname(),getpeername()函数:
- #include <sys/socket.h>
- int getsocketname(int sockfd,struct sockaddr* localaddr,socklen_t *addrlen);
- int getpeername(int sockfd,struct sockaddr* peeraddr,socklen_t *addrlen);
- 返回: 0 OK, -1 出错。
4.select()函数和poll()函数:
- #include <sys/select.h>
- #include <sys/time.h>
- int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout);
- 返回:准备好的描述子正数目,0--超时,-1 出错
timeval 结构:
- struct timeval
- {
- long tv_sec;//second
- long tv_usec;//microsecond微秒
- };
三种可能:
1.永远等待下去,仅在有一个I/O准备好时返回,这时,需要将timeout 置为NULL
2.等待固定时间,由timeout设定,或者有一个I/O准备好时返回。
3.根本不等待,则timeout必须指向timeval结构,切结构内元素数值为0.
5. 对于select(),以下情况发生时,套接口准备好读:
1.套接口接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮限度的当前值,对这样的套接口的
读操作,将不阻塞并返回一个大于0的值(即准备好读入的字节数),可以用SO_RCVLOWAT来设置此低潮值,
对于TCP,UDP,其默认值为1.
2.连接的读这一半关闭(也就是说接收了FIN的TCP连接),对这样的套接口的读操作将不阻塞且直接
返回0.
3.套接口是一个监听套接口且已完成的连接数为非0,正常情况下这样的监听套接口上的accept不会阻
阻塞。
4.有一个套接口错误待处理,这样的套接口的读操作将不阻塞且返回一个错误。
6.以下几种情况,套接口准备好写:
1.套接口的发送缓冲区的数据字节数大于等于套接口发送缓冲区低潮限度的当前值,
2.连接写的一半关闭,对这样的套接口的写操作将产生SIGPIPE
3.有一个套接口错误待处理。这样的套接口的写操作将不阻塞,且返回一个错误(-1),
7. 如果一个套接口存在带外数据,或者人处于带外标记状态,那他有异常条件待处理。
并且,一个套接口出错时,它由select标记为既可读也可写。
8.拒绝服务型攻击:
描述:客户端发送一个子节后就睡眠,服务器收到一个子节后,却在等待结束符,于是服务器阻塞。
预防:当服务器在处理多个客户时,服务器决不能阻塞于只与单个用户相关的函数调用。如果这样的话,
服务器将悬挂并拒绝为其他用户提供服务。
解决办法:
1. 使用非阻塞I/O
2.让每个用户由单独的控制现成提供服务器。
3.对I/O操作设置超时。
9.
- #inclue <poll.h>
- int poll(struct pollfd *fdarray,unsigned long nfds,int timeout);
- struct pollfd
- {
- int fd;
- short events; //events of interest on fd
- short revent; //events that occurred on fd
- };
注意:POLLNVAL 在events中不能被设置,但是当相应条件存在时,会在revents返回。
poll识别三个类别的数据: 普通(normal),优先级带(priority band)和高优先级(high priority);
10.以下条件返回特定的revent:
1.所有正规TCP和UDP数据都被认为是普通数据
2.TCP的带外数据被认为是优先级带数据。
3.当TCP连接的读这一半关闭时,也认为是普通数据,且后续的读操作返回0.
4.TCP连接错误,即可认为是普通数据,也可认为是错误(POLLERR),无论哪种,后续的读操作
都将返回-1,并将errno置为相应值。
5.在监听套接口上,新连接的可用性, 即可被认为是普通数据,也可认为是优先级带数据,大多
数实现都将其视为普通数据考虑。
6.poll有个漏洞,就是相同的返回结果又多种不同的选择。
11. nfds 标识 fdarray元素的个数,timeout值:
阅读(302) | 评论(0) | 转发(0) |