1.父子进程之间的关系
父子进程之间的关系:
区别:
1.fork函数的返回值不同
父进程中:>0,返回的是子进程的ID
子进程中:=0
2.pcb中的一些数据
当前的进程的id pid
当前的进程的父进程的id ppid
信号集
共同点:
某些状态下:子进程刚被创建出来,还没有执行任何的写数据的操作
-用户区的数据
-文件描述符表
父子进程对变量是不是共享的?
-刚开始的时候,是一样的,共享的。如果修改了数据,就不共享了。
-读时共享(子进程被创建,两个进程没有做任何的写操作)
-写时复制
2.GDB多进程调试
示例程序:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("begin...\n");
pid_t pid=fork();
if(pid>0)
{
printf("我是父进程:pid=%d ,ppid=%d \n",getpid(),getppid());
for(int i=0;i<10;i++)
{
printf("i=%d\n",i);
sleep(1);
}
}
else
{
printf("我是子进程:pid=%d ,ppid=%d \n",getpid(),getppid());
for(int j=0;j<10;j++)
{
printf("j=%d\n",j);
sleep(1);
}
}
return 0;
}
先看默认情况下:
生成带调试信息的可执行文件,开始调试:
所以:默认情况下追踪的是父进程,子进程直接运行完。
那么怎样设置调试子进程还是父进程呢?
可以使用set follow-fork-mode parent(默认) | child
为child时,表示调试子进程,为parent时,表示调试父进程(默认)。
重新进行调试,查看结果:
怎样调试当前进程时,让其他进程运行或者挂起呢?
可以使用 set detach-on-fork on | off
detach意为“脱离”,表示当前没有被调试的进程是否脱离GDB
默认值为on,表示调试当前进程的时候,其他进程(没有被调试的进程)脱离GDB,继续运行,直到结束。
如果为off,表示调试当前进程的时候,其他进程(没有被调试的进程)不脱离GDB,而是被GDB挂起,停在fork的地方,等待切换到该进程时被调试。
那么怎样从父进程切换到子进程进行调试呢?
从子进程再次切换到父进程同理。
下面测试使进程脱离GDB调试:
重新运行gdb open
参考:牛客网 C++高薪求职项目《Linux高并发服务器开发》2.3进程创建
专属优惠链接:
https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG