Administrator
发布于 2023-12-02 / 15 阅读 / 0 评论 / 0 点赞

网络编程(一)

C++高性能网络编程 | Jack Huang's Blog (huangwang.github.io)

第一部分 循环队列_哔哩哔哩_bilibili

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号线程托管

  • 父线程还在等待子线程,但子线程已经退出了,此时的子线程变成僵尸线程,因为内核还保留该子线程的消息

如何避免
  1. 父进程 表示忽略子线程的退出,此时子线程退出后会立即释放进程编号等资源

    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

没有该信号就创建

pthread线程库

《UNIX环境高级编程》的重点


评论