父子进程关系以及GDB多进程调试
父子进程之间的关系:
- 区别:
- fork函数的返回值不同
父进程中:返回的子进程的ID
子进程中:=0 - pcb中的一些数据
当前的进程的id pid
当前的进程的父进程的id ppid
信号集
- 共同点
某些状态下,子进程刚被创建出来,还没有执行任何的写数据的操作
- 用户区的数据
- 文件描述符表
父子进程对变量是不是共享的?
刚开始的时候,是一样的,共享的,如果修改了数据,不共享了,读时共享,写时拷贝。
GDB多进程调试
使用GDB调试的时候,GDB默认只能跟踪一个进程 ,可以再fork函数调用之前,通过指令设置GDB调试工具跟踪父进程或跟踪子进程,默认跟踪父进程。
调试父进程或者子进程:set follow-fork-mode [parent | child]
设置调试模式:set detach-on-fork [on | off]
默认为 on,表示调试的当前进程的时候,其他的进程继续运行,如果为off,调试当前进程的时候,其他进程被GDB挂起。
调试指令 | |
---|---|
查看调试的进程 | info inferiors |
切换当前调试的进程 | inferior id |
使进程脱离GDB调试 | detach inferiors id |
代码案例
//hello.c
#include <unistd.h>
#include <stdio.h>
int main(){
printf("begin\n");
if(fork()>0){
printf("我是父进程:pid=%d,ppid=%d\n",getpid(),getppid());
int i;
for(i=0;i<10;i++){
printf("i=%d\n",i);
sleep(1);
}
}
else{
printf("我是子进程:pid=%d,ppid=%d\n",getpid(),getppid());
int j;
for(j=0;j<10;j++){
printf("j=%d\n",j);
sleep(1);
}
}
}
- 打入断点
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000000007c8 in main at hello.c:7
2 breakpoint keep y 0x000000000000081e in main at hello.c:17
- 执行结果
(gdb) r
Starting program: /home/nowcoder/Linux/lession18/hello
begin
我是子进程:pid=3130,ppid=3126
j=0
Breakpoint 1, main () at hello.c:7
7 printf("我是父进程:pid=%d,ppid=%d\n",getpid(),getppid());
(gdb) j=1
j=2
j=3
j=4
j=5
j=6
j=7
j=8
j=9
(gdb) c
Continuing.
我是父进程:pid=3126,ppid=2581
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
[Inferior 1 (process 3126) exited normally]
- 调试子进程
(gdb) set follow-fork-mode child
(gdb) show follow-fork-mode
Debugger response to a program call of fork or vfork is "child".
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00005555555547c8 in main at hello.c:7
breakpoint already hit 2 times
2 breakpoint keep y 0x000055555555481e in main at hello.c:17
(gdb) r
Starting program: /home/nowcoder/Linux/lession18/hello
begin
[New process 3672]
我是父进程:pid=3671,ppid=2581
i=0
[Switching to process 3672]
Thread 2.1 "hello" hit Breakpoint 2, main () at hello.c:17
17 printf("我是子进程:pid=%d,ppid=%d\n",getpid(),getppid());
(gdb) i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
gdb8.0以上版本多进程调试 set detach-on-fork有一些问题,可以降低到7.0版本学习。