spawn-fcgi源码阅读

spawn-fcgi源码阅读

收获

可以解除到socket编程,在unix系统下的一些特性,比如一切皆文件。连socket也是一个文件描述符,这也是为什么在提升服务器并发性的时候需要增加文件描述符的数量,因为有些系统的文件描述符的上限只有1024个,大大限制了可以接收的请求数量。而且其实我的本意是要看一下并发模型的,结果发现这个spawn-fcgi根本没有实现任何的并发代码,感觉只是用了内核自带的并发模型。

参数解析部分

  • argc记录了参数的数量
  • argv是一个纪录参数的数据
  • optind是指向当前的参数指针,初始值为1
  • getopt会让optind不断下移,当没有更多的参数的时候返回getopt 返回-1
  • getopt的第三个参数是optstring,如果有冒号,则说明这个选项需要一个参数
  • 每次都会把参数的指针放到optarg中
  • strtol 用于将一个字符串转换为对应基数的长整型,它会先忽略optarg的前面的尽量多的空格,然后遇到一个非空格字符后,就开始尽可能地转换字符
  • 返回的时候如果endptr不为空的话,会让它指向翻译后的第一个字符。猜测:如果完全翻译完,是会返回NULL的,这样才可以看输入是否合法

socket的类型

socket有两种,一种是绑定端口的,一种是绑定文件的(unixsocket),其对应的协议族也是不一样的。

open

需要打开文件来表示运行的进程。这里还涉及了很多unix类系统的文件操作。

unix权限保护

运行程序的用户和程序拥有者的权限关系,同时还有SUID和GUID这两个可以让程序拥有者把权限“借”给程序的运行者,例如/etc/passwd就是这样,虽然非root用户无法对其进行直接修改,但是却可以通过执行对应的验证程序,获得root权限从而读取/etc/passwd的信息。

chroot 一种沙盒机制

这个可以将程序运行的作用范围控制在一定的距离内。

fork()

这个可以返回子进程的进程号,同时子进程拥有父进程的所有上下文,也就是让程序运行到fork()前的状态,因此可以用child来区分当前进程是子进程还是父进程。

文件描述符

文件描述符的前三个0,1,2总是stdin stdout 和stderr。大量的应用程序都依赖这个特性,虽然这个好像并不是标准。

比sleep更精确的计时器

在unix中sleep的精确度为1s,而select(0,NULL,NULL,NULL,&val)是一个更精确的计时器,可以以微秒为单位。

源码及注释

下载地址
spawn-fcgi.c

分享到