`
文章列表
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/param.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <signal.h> void my_daemon() { int pid, fd; // 1.转变为后台进程 ...
dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 如果调用成功,这两个 ...
每一个进程都有自己的一组资源限制,在(*)inux系统中我们可以通过#include <sys/resource.h>int getrlimit(int resource, struct rlimit *rlim);int setrlimit(int resource, const struct rlimit *rlim);这2个API来取得和设置资源getrlimit用来取得setrlimit用来设置 这二个参数都需要一个要控制的资源 比如控制CPU、内存、文件描述符个数等等的控制,作为第一个参数传入,第二个参数是一个rlimit的结构体地址(指针),他的结构如下定义:定义放 ...
  我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等) 2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。 3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplexing、非阻塞、异步等各种技术。 关于TCP/IP协议,建议参考Richard Stevens的《TCP/IP Illustrated,vol1》(TCP/IP详解卷1)。 关于第二层面,依然建议 ...

UNIX缓冲机制

某日一朋友写了一个HELLO WORLD代码,出不来结果,代码如下: #include <stdio.h> int main(int argc, char **argv) { printf("hello world!"); _Exit(0); }    注意到,在代码中printf语句打印的字符串最后没有带换行 ...
    tcp socket的发送缓冲区实际上是一个结构体struct sk_buff的队列,我们可以把它称为发送缓冲队列,由结构体struct sock的成员sk_write_queue(struct sk_buf_head)表示。sk_write_queue是一个结构体struct sk_buff_head类型,这是一个struct sk_buff的双 ...
  fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。于是起初我就感到奇怪,子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢?!原来在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、 ...
写时复制页面保护机制是一种优化,内存管理器利用它可以节约内存。当进程为一个包含读/写页面的内存区对象映射了一份写时视图,而并非在映射该视图时创建一份进程私有的拷贝(Hewlett  Packard  OpenVMS操作系统就是这样做的 ...
  1、序      详细实现了二叉查找树的各种操作:插入结点、构造二叉树、删除结点、查找、  查找最大值、查找最小值、查找指定结点的前驱和后继 2、二叉查找树简介      它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树 3、二叉查找树的各种操作         此处给出代码,注释非常详细,具体操作请参考代码:   /******************************************** ...
linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值。 linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2 以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个 ...
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。插入构建AVL树用时为O(lg n). 因为树高为O(lg n),在各个调整节点时旋转中没有循环所以为O(1)。   红黑树是在二叉查找树上多了一个存储颜色的节点,颜色只能是红或者黑。根据遍历树时对颜色遍历来确保每个路径长不能超过其他路径长的2倍,几乎是平衡的。红黑树并不追
  昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有提到,通过查看服务器网络状态检测到服务器有大量的CLOSE_WAIT的状态。   在服务器的日常维护过程中,会经常用到下面的命令:   Plain代码 

学习使用epoll

epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。     一、epoll的优点 支持一个进程打开大数目的socket描述符。 IO效率不随FD数目增加而线性下降。   二、epoll的使用 epoll有2种工作方式:LT和ET。    LT(level triggered,水平触发)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中, 内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任操
ET模型的逻辑:内核的读buffer有内核态主动变化时,内核会通知你, 无需再去mod。写事件是给用户使用的,最开始add之后,内核都不会通知你了,你可以强制写数据(直到EAGAIN或者实际字节数小于 需要写的字节数),当然你可以主动mod OUT,此时如果句柄可以写了(send buffer有空间),内核就通知你。这里内核态主动的意思是:内核从网络接收了数据放入了读buffer(会通知用户IN事件,即用户可以recv数据)并且这种通知只会通知一次,如果这次处理(recv)没有到刚才说的两种情况(EAGIN或者实际字节数小于 需要读写的字节数),则该事件会被丢弃,直到下次buffer发生变 ...
winpcap是对链路层的封装,而链路层是不对IP分片进行排序。 TCP传播方式应该是,应用层将数据从应用进程的缓冲区写入套接字发送缓冲区(可用SO_SENBUF设置),TCP分片时从套接字发送缓冲区取得MSS-TCP头数量 [ MSS <=MTU-IP头数量,一般由对方通告,(对方通告可以得到路径MTU,以免在通过路由等网络设备或到达对方主机时再分片)如果对方没有通告则设置为536 ] 大小的数据加上TCP头,传给IP层,IP层加上IP头,再将数据(IP头+TCP头+用户数据)分为小与MTU的包发给链路层的输出队列。因为TCP层转数据到IP层时,只传等于MSS大小的TCP分节,再 ...
Global site tag (gtag.js) - Google Analytics