2.5父子进程关系及GDB多进程调试

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值