这是我学习Unix(主要是linux)系统编程与网络编程的笔记,附上部分源码
-
进程
- 创建
fork
- 执行
exec
- 销毁
wait/waitpid(SIGCHLD)
- 进程间通信:
- 匿名管道
pipe
,命名管道(FIFO)mkfifo
- System V IPC(还有一组POSIX接口,更易用,可以参考
《TLPI》
)- 信号量
semget
、semop
、semctl
- 消息队列
msgget
、msgsnd/msgrcv
、msgctl
- 共享内存
shmget
、shmat/shmdt
、shmctl
- 信号量
- UNIX域套接字
socketpair/socket
,socket
- 信号
kill
- 匿名管道
- 创建
-
线程
- 线程模型:内核线程、用户线程、双层调度
- 线程API
- 创建
pthread_create
- 初始化
pthread_once
- 结束
pthread_exit
- 回收
pthread_join
- 取消
pthread_cancel
、pthread_setcancelstate
、pthread_setcanceltype
- 线程属性
pthread_attr_init
、pthread_attr_destroy
、pthread_attr_*
- 创建
- 线程同步
- 互斥锁
pthread_mutex_*
、读写锁pthread_rwlock_*
、自旋锁pthread_spin_*
- 条件变量
pthread_cond_*
- 屏障
- POSIX信号量
sem_*
- 互斥锁
- 线程与信号
pthread_sigmask
、sigwait
、pthread_kill
- 线程和进程
pthread_atfork
-
I/O复用
select poll轮询,epoll回调
select poll索引就绪文件描述符复杂度为O(n),epoll为O(1)
epoll适用于连接数量多,活动连接少的情况
- select
- poll
- epoll:
epoll_create
,epoll_ctl
,epoll_wait
-
文件I/O
- 基本I/O:
open
,read
,write
,lseek
,close
,dup2/dup
,sync
,fcntl
- 高级I/O:分散读集中写
readv/writev
,存储映射mmap/munmap
,linux零拷贝sendfile/splice/tee
- 标准I/O
- 基本I/O:
-
文件其他操作
- 获取文件信息:
stat
- 访问权限:
access
,umask
,chmod
- 所有者:
chown
- 目录操作:
mkdir
,opendir
,readdir
,closedir
,rmdir
- 文件操作:
truncate
,rename
(目录也适用) - 硬链接:
link
,unlink
- 符号链接:
symlink
,readlink
- 获取文件信息:
-
信号
- 发送信号:
kill
- 处理信号:
signal
,sigaction
- 信号集:
sigemptyset
,sigfillset
,sigaddset
,sigdelset
,sigismember
,sigprocmask
,sigpending
- 信号的文件描述符:
signalfd
- 发送信号:
-
编程规范
- 日志:
syslog
,openlog
,setlogmask
,closelog
- 用户和组:真实用户
uid
,有效用户euid
,真实组gid
,有效组egid
,设置用户/组ID - 进程关系:进程组
pgid
,会话sid
- 资源限制:
getrlimit
- 进程目录:
getcwd
,chdir
,chroot
- 守护进程:
daemon
- 日志:
-
socket
-
4个字节序转换函数
htonl
、htons
、ntohl
、ntohs
(n:network h:host) -
3种常用socket地址格式
sockaddr
、sockaddr_in
、sockaddr_in6
-
2个ip地址转换(书写型和计算机使用型)函数
inet_ntop
、inet_pton
(适用ipv4和ipv6) -
tcp服务端:
socket
、bind
、listen
、accept
、close/shutdown
tcp客户端:
socket
、connect
、close/shutdown
-
4组读写函数
read/write
、recv/send
、recvfrom/sendto
、recvmsg/sendmsg
-
获取socket绑定地址
getsockname
、getpeername
-
socket选项
setsockopt
、getsockopt
-
带外数据
sockatmark
-
地址查询函数
getaddrinfo
、freeaddrinfo
,getnameinfo
,getnameinfo
-
-
服务器编程框架
- I/O处理单元
- 五种I/O模型:阻塞I/O、非阻塞I/O、信号驱动I/O、异步I/O、I/O多路复用(select、poll、epoll)
- 两种事件处理模式:Reactor、Proactor
- 逻辑单元
- 两种并发模式:半同步/半异步模式、领导者/追随者模式
- 高效逻辑处理方式:有限状态机
- 存储单元
- I/O处理单元
琐碎知识:
- 带外数据
- 发送/接收带外数据,用MSG_OOB标志的send/recv
- 检测带外数据的两种方式:SIGURG信号,IO复用的异常事件
- 带外数据的定位:
sockatmark
- 四种定时方法
- socket选项SO_RCVTIMEO和SO_SNDTIMEO
- SIGALRM信号
- I/O复用系统调用的超时参数
- 时间文件化timerfd
- 常见信号含义
- SIGCHLD:子进程终止时向父进程发送
- SIGPIPE:进程向读端被关闭的管道或socket连接中写数据,默认杀死进程