linux下daemon守护进程的实现(以nginx代码为例)

  setsid相关知识: 通过调用setsid函数,使得新创建的进程脱离控制终端,同时创建新的进程组,并成为该进程组的首进程。为了使读者更好地理解这一步骤,下面介绍进程组、会话(session)的基本概念。 在Linux系统中,所有的进程都属于各自的进程组。进程组是一个或多个进程的集合。打个比方,可以认为某个班级是一个进程组,而其中成员就是进程。一个班级至少有一个成员。当一个班级的最后一个成员不存在的时候,这个班级也就不存在了,也就是进程组消亡了。 每个进程组都有类似于进程号的标识,称为进程组ID。进程组ID是由领头…
阅读全文…

T​C​P​状​态​转​换​图​

T​C​P​状​态​转​换​图​: 为什么建立连接协议是三次握手,而关闭连接却是四次握手? 因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一 个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未 必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 和FIN报文多数情况下都是分开发送的。 为什么TIME_WAIT状态还需…
阅读全文…

C语言位运算技巧大全

判断int型变量a是奇数还是偶数: a&1 = 0 偶数a&1 = 1 奇数 整数的平均值 对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:

判断int型变量a是奇数还是偶数 判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

不用temp交换两个整数 [crayon-599d41562f2331890631…
阅读全文…

一个“蝇量级” C 语言协程库

协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比 线程还要早,按照 Knuth 的说法“子例程是协程的特例”,一个子例程就是一次子函数调用,那么实际上协程就是类 函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。只不过子例程只有一个调用入口起始点,返回之后就结束了,而 协程入口既可以是起始点,又可以从上一个返回点继续执行,也就是说协程之间可以通过 yield 方式转移执行权,对称(s…
阅读全文…

JavaScript初学者应知的24条最佳实践

原文:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意发布日期,觉得不错就翻译了,翻译到 JSON.parse 那一节觉得有点不对路才发现是 2009 年发布的文章,不过还是不错的啦。另外,文章虽说 24 条最佳实践,其实只有 23 条,不知道原作者怎么漏了一条。) 1. 优先使用 ===,而不是 == JavaScript 使用两种相等性操作符:===,!== 和 ==,!=。通常认为做比较的最佳实践是使用前一组操作符。 “若两个操作数的类型和值相同,那么 === 比较的结果为真,!== 比较的结果为假。&#822…
阅读全文…

手把手教你把Vim改装成一个IDE编程环境

1 写在前面 Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用的IDE是何等的重要啊, 估计很多人就是卡在这个门槛上了, “工欲善其事, 必先利其器”嘛, 我想如果有一个很好用的IDE, 那些Linux牛人也会欢迎的. 这都是劳动人民的美好愿望罢了, 我今天教大家把gvim改装成一个简易IDE, 说它”简易”是界面上看起来”简易”, 但功能绝对不比一个好的IDE差, 该有的功能都有, 不该有…
阅读全文…

MySQL基本概念--索引&索引类型

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。 在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );   我们随机向里面插入了10000条记录,其中有一条:5555, admin。 在查找username=”admin”的记录 SELECT * FROM mytable WHERE username=&#8217…
阅读全文…

nginx中request buf的设计和实现

在nginx中request的buffer size我们能够通过两个命令进行设置,分别是large_client_header_buffers和client_header_buffer_size。这两个是有所不同的。 在解析request中,如果已经读取的request line 或者 request header大于lient_header_buffer_size的话,此时就会重新分配一块大的内存,然后将前面未完成解析的部分拷贝到当前的大的 buf中,然后再进入解析处理,这部分的buf也就是large_client_header_buffers,也叫做large hader的处理。接下来我会…
阅读全文…

linux下tcp选项TCP_DEFER_ACCEPT详解

TCP_DEFER_ACCEPT这个选项可能大家都知道,不过我这里会从源码和数据包来详细的分析这个选项。要注意,这里我所使用的内核版本是3.0. 首先看man手册中的介绍(man 7 tcp): TCP_DEFER_ACCEPT (since Linux 2.4) Allow a listener to be awakened only when data arrives on the socket. Takes an integer value (seconds), this can bound the maximum number of attempts TCP will make to …
阅读全文…