Unix网络编程(八、epoll) 发表于 2018-12-21 | 更新于 2018-12-22 | 分类于 socket 三种I/O模型的对比简单总结select/poll/epoll三者的区别如下: select: 监听的文件描述符个数有最高上限 就绪检查时需要遍历所有事件,效率低 内核态和用户态需要内存拷贝,开销大 poll: 没有最大连接数的限制,基于链表来实现 就绪检查时需要遍历所有事件,效率低 内核态 ... 阅读全文 »
Unix网络编程(六、select模型) 发表于 2018-12-15 | 更新于 2018-12-16 | 分类于 socket select函数原型1int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); 头文件#include <sys/select.h ... 阅读全文 »
Unix网络编程(七、poll) 发表于 2018-12-15 | 更新于 2018-12-16 | 分类于 socket poll123456789101112#include <poll.h>// 成功返回就绪的文件描述符个数,超时返回0,失败返回-1int poll(struct pollfd *fdarray, unsigned int nfds, int timeout);// 该就够用于测试指定f ... 阅读全文 »
Unix网络编程(五、五种I/O模型) 发表于 2018-12-14 | 分类于 socket I/O模型常用的I/O模型分为五大类 阻塞I/O 非阻塞I/O I/O复用 异步I/O 信号驱动式I/O 阻塞I/O最流行的i/o模型就是阻塞i/o模型,在前面试验的所有代码中,用的都是该模型。在默认情况下,所有套接字都是阻塞的。比如说调用了recvfrom函数。如果此时内核中没有数据的话,进 ... 阅读全文 »
Unix网络编程(四、非正常连接下的错误处理) 发表于 2018-12-11 | 更新于 2018-12-13 | 分类于 socket 前言前三篇都是说的在正常的三次握手下的处理。但是现实往往不会一直都能顺利连接,想要实现一个强大的服务端,必须考虑到各种可能发生的情况,并对其有处理策略。 accept返回前连接终止当服务端接收到客户端的连接请求后,此时会发生三次握手,当三次握手完成之后,该连接已由tcp排队,就等着轮到它了由acce ... 阅读全文 »
Unix网络编程(三、waitpid解决多客户端连接时引发的僵尸进程问题) 发表于 2018-12-11 | 更新于 2018-12-13 | 分类于 socket 引发路径上一节的代码解决的单客户端连接时引发的僵尸进程问题。但是我们的服务器环境通常都是有大量的客户端同时连接过来,在这种情况下,我们的代码就显得不是那么健壮了,它仍然会引发僵尸进程的问题。1234567891011121314int main(int argc, const char *argv[ ... 阅读全文 »
Unix网络编程(二、回显服务器代码分析和优化) 发表于 2018-12-10 | 更新于 2018-12-11 | 分类于 socket 代码分析代码如下: 回显服务端12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717 ... 阅读全文 »
Unix网络编程(一、简单回显服务器) 发表于 2018-12-08 | 更新于 2018-12-11 | 分类于 socket socket APIsocket1int socket(int domain, int type, int protocol); 功能:打开一个socket返回值:成功返回对应的文件描述符,否则为-1参数: family指明了协议簇,通常AF_INET、AF_INET6、AF_LOCAL等; ... 阅读全文 »
二十三. 进程同步与进程间通信 发表于 2018-05-18 | 更新于 2018-12-09 | 分类于 kernel 进程同步看一下上一节写的调用外部shell的方法。 1234567891011121314151617181920memset(final_path, 0, sizeof(final_path));int32_t pid = fork();if (pid){ while(1); ... 阅读全文 »
二十二. 让shell支持外部命令 发表于 2018-05-16 | 更新于 2018-12-09 | 分类于 kernel exec在linux的bash shell中,执行外部命令时,该shell会fork一个子进程,这个子进程调用exec从磁盘上加载外部命令对应的程序。这是exec的一个应用。通过它的应用来看原理 exec会把一个可执行文件的绝对路径作为参数,把当前正在运行的用户进程的进程体用该可执行文件的进程体替换 ... 阅读全文 »