C++高性能网络编程 | Jack Huang's Blog (huangwang.github.io)
Linux的系统错误
sterror()
perror() 把最近的一次错误打印处理
不要去背头文件
man 3 mkdir
linux信号
kill信号列表 - zeroPatrick - 博客园 (cnblogs.com)
9的信号不能被捕获!!!不可被忽略!!!
2是ctrl C,程序主动退出
15是kill默认,程序主动退出
signal()
alarm(5)闹钟,5秒
exit(0)推出进程
进程终止
echo $?
资源的释放
_exit() _Exit() 直接退出,不释放对象
可执行文件
system()
执行新的程序,新进程编号和主进程不一样
exec函数族
把要执行的程序成为自己的一部分,进程编号和主进程一样
execl和execv的区别
Linux进程
0、1、2好进程
0 所有进程的执行
1 systemd 内核的初始化和系统配置。
2 kthreadd 负责所有内核线程的调度和管理
进程标识
子、父进程的数据不共享,并且执行顺序也不一定。
进程和虚拟地址的关系
子、父进程的数据对象的地址是相同的,但是并不代表他们的物理地址是相同的,往那个地址修改的东西并不会影响其他线程。
为什么要怎么设计,因为要考虑指针和引用,不然可能fork后程序就运行不了。
fork的两种使用场景
父进程不断等待,子线程做事情
共享文件
vfork()
保证子进程先执行到exc或exit()才运行
僵尸线程
父退出,子还在运行,子线程会被1号线程托管
父线程还在等待子线程,但子线程已经退出了,此时的子线程变成僵尸线程,因为内核还保留该子线程的消息
如何避免
父进程 表示忽略子线程的退出,此时子线程退出后会立即释放进程编号等资源
父进程 wait()等待子进程在退出
发送信号
pid>0,给该进程发送
pid=0,给同一进程组的所有进程发送,包括自己
pi-1,给所有进程发,如关机时
多进程和信号
共享内存
线程用互斥锁实现同步
进程用信号量实现同步
shmgt函数(创建)
键值、大小、权限
查看共享内存
ipcs -m
shmat函数(连接)
shmdt分离
shmctl删除
共享内存的结构体
只能用c++内置的结构体,不能用容器等
大小固定,不能自动扩展,凡是要放在堆里的结构,都不能使用
循环队列
共享内存的局限
信号量
ipcs -s
查看系统中的信号量
if ((m_semid=semget(key, 1, 0666|IPC_CREAT |IPC_EXCL))==-1) {//IPC_CREAT
IPC_EXCL
IPC_EXCL确保只有一个进程创建,其他进程则会变成获取
IPC_CREAT
没有该信号就创建