2.3-2.5进程创建、父子进程虚拟地址空间情况及父子进程关系及GDB多进程调试

/*
    #include <sys/types.h>
    #include <unistd.h>
    pid_t fork(void);
    作用:用于创建子进程
    返回值:
        fork()的返回值会返回两次。一次是在父进程,一次是在子进程中
        在父进程中返回创建的子进程的id号
        在子进程中返回0
        如何区分父进程和子进程:通过fork的返回值。
        在父进程中返回-1,表示创建子进程失败,并且设置errno
    父子进程之间的关系
    区别:
        1.fork()函数返回值不同
            父进程中:>0 返回的子进程的id
            子进程中:=0
        2.pcb中的一些数据
            当前的进程的id pid
            当前的进程的父进程的id ppid
            信号集不同
    
    共同点:
        某些状态下:子进程刚被创建出来,还没有执行任何写数据的操作
            -用户区的数据相同
            -文件描述符的表相同
    
    父子进程对变量是否共享?
        -刚开始的时候是共享的,如果修改了数据就不共享了
        -读时共享(子进程被创建,两个进程没有做任何写的操作),写时拷贝
*/
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
    //创建子进程
    pid_t pid = fork();

    //判断是父进程还是子进程
    if(pid > 0){
        //如果大于0,返回的是创建的子进程的进程号,当前是父进程
        printf("i am parent process,pid : %d, ppid : %d\n",getpid(),getppid());
    }
    else if(pid==0){
        //说明当前是子进程
        printf("i am child process, pid : %d, ppid : %d\n",getpid(),getppid());
    }
    for(int i=0;i<3;i++){
        printf("i : %d , pid : %d \n",i,getpid());
        sleep(1);
    }
    return 0;
}
/*
Linux 的 fork() 使用是通过写时拷贝实现。写时拷贝是一种可以推迟甚至避免拷贝数据的技术。内核并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间。只有在写入时才会复制地址空间(重新开辟一块内存),从而使各个进程拥有自己的地址空间。即资源的复制只有在写入时才会进行,在此之前,只有以只读的方式进行。
fork() 之后的父子进程共享文件,此时的 fork() 产生的子进程与父进程相同的文件描述符指向相同的文件表,引用计数增加,共享文件偏移指针。
*/

 gdb默认调试父进程

set follow-fork-mode child 设置调试为子进程

也可通过inferior id 来转换(id通过info inferiors来查看)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值