POSIX 相关 API 的 Zeal 地址:tcc bug关于 strcmp vs strncmp 的随想。关于 flag 的一些随想类型系统的设计会极大影响程序的样子守护进程int instead of struct *getoptapi style评价
POSIX 相关 API 的 Zeal 地址:
下载解压到 Zeal 的 docsets 就可。
posix to c is like dom api to ecma js
tcc bug
TOCTTOU 傻逼名字 + 1
关于 strcmp
vs strncmp
的随想。
注意到 apue 上有些地方用的 strcmp, 思考了一下发现主要是 zip 是否穷尽。
如果攻击者构造极长的字符,那 strcmp 会缓冲区溢出。
但是 strcmp with fixed str 有长度上限。
就只会判断开头的 2 个
关于 flag 的一些随想
比如 POSIX 里面打开文件用 open(xxx, READ | WRITE) 啥的
这里 READ 就是 bit_flag,也就是说实现了这样一种系统:
两两不同
元素间可以取 OR
可以判定某一位
那这种特征让我们想到什么呢?线性空间。每一位都是正交基。& A 就是取了这个上面的投影。| 就是线性组合,^ 就是去掉。
类型系统的设计会极大影响程序的样子
里面洋洋洒洒写了一堆 lock + pthread 的 api。
rust be like :
Arc<Mutex<T>>
以及线程并行直接 rayon,还不容易写错。
这就是 ~~抽象~~ 调库 带给我的自信。
类似生成元 vs 生成的结果
守护进程
提到 init.d ,太老了,现在全部 systemd 了,除了 alpine
int instead of struct *
各种 socket,file 都是用 int 当 index 指代对象,而不是一个 Socket 对象传来传去。
比如都是 int fd
getopt
体现了老工具一贯的难用。
和 sed 这种一脉相承。
还有一堆 aio_* 相关的 api,先略过
api style
由于 POSIX 的设计,所以里面没有链式调用,而是清一色的 api 调用 + 返回 fd + 判断 NULL
好处:系统 api 实现简单。
坏处:没有半点类型系统。写错完全没 b 数。
思考下面的例子
lock 和 unlock 全凭个人自觉,写错就炸。
自带 utf8
自带错误处理
写起来可以链
评价
POSIX 就是 portable 的 shit, 比如 cosmopolitan
和 anal sex 一样