前言
守护进程(daemon)是在系统引导装入时启动,仅在系统关闭时才终止。守护进程是在后台运行的。
守护进程特征
在命令行下输入 ps -axj(BSD系统) 查看系统中各个进程的状态。
thinkphp5.1和swoole
tp5的安装使用composer安装,使用以下命令安装
1 | composer create-project topthink/think tp5 --prefer-dist |
thinkphp5.1.18更新,完善了swoole的支持,不用再自己更改Request类了
ThinkPHP5.1.18版本发布——完善Swoole/Workerman支持
swoole的安装参考我写的swoole安装教程
  对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数。
  UNIX系统shell把文件描述符0与进程的标准输入关联,1与标准输出关联,2与标准错误关联
通常 把0,1,2 这三个幻数替换成常量 STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
1 | #include <fcntl.h> |
path 参数是要打开或创建文件的名字。oflag参数 用来说明该函数的多个选项。
有以下一个或多个常亮进行 “或”运算构成oflag参数 (这些常量定义在<fcntl.h>)
下面这些常量是必须的
这5个常量中必须指定一个且只能指定一个。还有一些常量是可选的(慢慢补充)
1 | #include <unistd.h> |
whence 参数
1 | #include "apue.h" |
1 | //read 函数从打开的文件中读取数据 |
调用write函数向打开的文件写数据
1 | #include <unistd.h> |
write 出错的一个常见原因是磁盘已写满 或者超过了一个给定进程的文件长度限制
普通文件 写操作从当前文件偏移量开始。打开文件时指定了O_APPEND选项(O_APPEND每次写都追加到文件末尾),
每次写操作将文件偏移量设置在文件的当前结尾处,在一次写成功后,该文件偏移量增加实际写的字节数
1 | //只使用read 和 write函数 复制文件 |
UNIX系统为这样的操作提供了一种原子操作,即在打开文件时时设置O_APPEND标志,使得进程每次write时都将文件偏移量设置到文件末尾处,也就不需要lseek函数。
1 | #include <unistd.h> |
调用pread/pwrite相当于先调用lseek再调用read/write,但又与这种调用有所区别
用来复制文件描述符
1 | #include <unistd.h> |
如果 fd == fd2 则返回fd2的文件描述符,不关闭它。否则fd2的FD_CLOEXEC文件描述符标志被清除,这样fd2在进程调用exec时是打开状态
返回的新的文件描述符与参数fd共享同一个文件表项
函数原型
1 | #include <unistd.h> |
1 | // 改变已打开的文件属性 |
本章主要讲解了文件系统的其他特征和文件的性质。
1 | #include <sys/stat.h> |
成功返回0,失败返回-1
buf参数是一个指针,指向一个我们必须提供的结构 在mac系统上该结构的定义如下
1 |
|
文件类型
宏 | 文件类型 |
---|---|
S_ISREG() | 普通文件 |
S_ISDIR() | 目录文件 |
S_ISCHR() | 字符特殊文件 |
S_ISBLK() | 块特殊文件 |
S_ISFIFO() | 普通或FIFO |
S_ISLNK() | 符号链接 |
S_ISSOCK() | 套接字 |
取命令行参数,然后根据每个命令行参数打印文件类型
1 | /* |
除了文件外,目录字符特殊文件都有访问权限
每个文件有9个访问权限位,分为如下3类
在 <sys/stat.h>中定义
st_mode屏蔽 | 含义 |
---|---|
S_IRUSR | 用户读 |
S_IWUSR | 用户写 |
S_IXUSR | 用户执行 |
st_mode屏蔽 | 含义 |
---|---|
S_IRGRP | 组读 |
S_IWGRP | 组写 |
S_IXGRP | 组执行 |
st_mode屏蔽 | 含义 |
---|---|
S_IROTH | 其他读 |
S_IWOTH | 其他写 |
S_IXOTH | 其他执行 |
当用open函数打开文件时,内核以进程的有效用户id和有效组id为基础执行其访问文件权限测试。但有时,进程希望按照其实际用户id和实际组id来测试访问能力。access函数和faccessat函数式按照实际id进行测试
1 | #include <unistd.h> |
如果测试文件存在,mode就为F_OK,否则mode为如下图中所列常量的按位或。
mode | 说明 |
---|---|
R_OK | 测试读权限 |
W_OK | 测试写权限 |
X_Ok | 测试执行权限 |
代码示例 |
1 | #include "apue.h" |
umask为进程设置文件模式创建屏蔽字,并返回之前的值(没有出错返回)
1 | #include <sys/stat.h> |
cmask 参数有9个访问权限位若干个按位”或”构成
常见的几种umask值
stat 结构成员st_size 表示以字节为单位的文件长度,改字段只对普通文件,目录文件,链接文件有作用
1 | #include <unistd.h> |
如果文件长度大于length,则length后的数据不能访问,如果小于,文件长度增加。增加的这段填充0(可能在文件中创建了一个空洞)
任何一个文件可以有多个目录项指向其i节点。创建一个现有文件的链接的方法是使用link或linkat函数
1 | #include <unistd.h> |
删除一个目录项,可以调用unlink函数
1 | #incude <unistd.h> |
删除目录项,并将由pathname所引用文件链接计数减1。只有当链接计数达到0时,该文件才被删除。
为了解除对文件的链接,必须对包含该目录项的目录具有写和执行权限。如果该目录设置了粘着位,则对该目录必须具有写权限,并且要具备下面三个条件之一:
unlink通常用于确保即使程序崩溃,它所创建的临时文件也不会遗留下来。进程用open和creat创建一个文件,然后立即调用unlink,因为该文件仍然是打开的,所以不会将其内容删除。只有当进程关闭该文件或终止时,该文件的内容才被删除。
1 | #include <stdio.h> |
对于文件remove与unlink的功能类似,对于目录与rmdir相同
文件或目录可以使用rename和renameat重命名
1 | #include <stdio.h> |
oldname参数是 目录、文件还是符号链接有以下几点说明
符号链接是对一个文件的间接指针,引用符号链接是避免硬链接的一些限制
符号链接一般用于将一个文件或整个目录结构移到系统的另一个位置。符号链接有着自己的inode号和用户数据块
对每个文件通常维护3个时间段
字段 | 说明 | 例子 | ls选项 |
---|---|---|---|
st_atim | 文件数据的最后访问时间 | read | -u |
st_mtim | 文件数据的最后修改时间 | write | 默认 |
st_ctim | i节点状态的最后更改时间 | chmod,chown | -c |
本文是李笑来正在预售的《七年就是一辈子》中的内容,略经 36 氪编辑。作者李笑来的微信公众号为 “学习学习再学习(xiaolai-xuexi)”。
书大抵上分为两种:虚构类(Fiction),非虚构类(Non-Fiction)。读非虚构类的书籍,是为了获取新知识,并应用到生活中,让自己获得进步;就我个人而言,我更喜欢看非虚构类的书籍,从中获得的愉悦,感觉更大,因为那种愉悦通常有更为坚实的支撑 —— 进步。而虚构类的书籍,在大学毕业之后已经很少读了,可能是因为我自己在那里很难体会到太多的乐趣,更可能的另外一个原因是我已经彻底把获取那种愉悦的途径转移到了影视作品上。
优秀软件收集目录
k8s
traefik
简单的可以使用redis
可靠的可以使用
rabbitmq
kafka
mimo
Cloudreve: go实现的网盘
gitlab
jenkins
docker
分布式redis
codis: https://github.com/CodisLabs/codis/blob/release3.2/doc/FAQ_zh.md
分布式数据库
tidb: https://github.com/pingcap/tidb
分布式id生成
snowflake: snowflake的go实现 用于分布式id生成器 https://github.com/bwmarrin/snowflake
ab
wrk: 类似ab压测,可测试api web的性能: https://github.com/wg/wrk
sysbench: 数据库,磁盘,内存压测
redis-benchmark: redis的压测工具
uuid 生成 https://github.com/satori/go.uuid
excel 操作 https://gitee.com/xurime/excelize
可视化展示docker image: https://github.com/wagoodman/dive
spiped: ssl代理,可以用在redis之间安全的传递数据