2.5、父子进程关系以及GDB多进程调试
1.父子进程关系
父子进程之间的关系:
区别:
1.fork()函数的返回值不同
父进程中:> 0 返回子进程的ID
子进程中:= 0
2.pcb中的一些数据
当前的进程id pid不同
当前的进程的父进程id ppid不同
信号集不同
共同点:
某些状态下子进程刚被创建出来,还没有进行任何写的操作
- 用户区数据相同
- 内核区数据里面,文件描述符表相同
父子进程对变量是不是共享的?
- 刚开始的时候,是一样的,共享的。如果修改了数据,就不共享了。
- 读时共享(子进程被创建,两个进程没做任何写的操作),写实拷贝
2.GDB多进程调试
使用 GDB 调试的时候,GDB 默认只能跟踪一个进程,可以在 fork 函数调用之前,通过指令设置 GDB 调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。
①.设置调试进程
- 展示调试父进程或者子进程:
show follow-fork-mode [parent(默认)| child]
- 设置调试父进程或者子进程:
set follow-fork-mode [parent(默认)| child]
②.调试模式
- 展示调试模式:
show detach-on-fork [on | off]
- 设置调试模式:
set detach-on-fork [on | off]
- 认为
on
,表示调试当前进程的时候,其它的进程继续运行,如果为off
,调试当前进程的时候,其它进程被GDB
挂起。 - 查看调试的进程:
info inferiors
- 切换当前调试的进程:
inferior id
- 使进程脱离
GDB
调试:detach inferiors id
// 生成调试代码
gcc hello.c -o hello -g
// 运行调试代码
gdb hello