子进程继承了父进程的什么

子进程会继承父进程的部分属性,如UIDs,GIDs,环境变量,堆栈等,但它们各自拥有独立的副本,可以自由修改而不会相互影响。例如,子进程和父进程可以独立修改堆栈中的变量,但它们操作的是不同的堆栈。对于由malloc分配的内存,子进程的修改不会影响父进程。同时,每个进程都有自己的进程号和文件描述符副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子进程继承父进程部分

子进程继承父进程的部分
用户号UIDs和用户组号GIDs
环境Environment
堆栈
共享内存
打开文件的描述符
执行时关闭(Close-on-exec)标志
信号(Signal)控制设定
进程组号
当前工作目录
根目录
文件方式创建屏蔽字
资源限制
控制终端

子进程独有

进程号PID
不同的父进程号
自己的文件描述符和目录流的拷贝
子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
不继承异步输入和输出

示例以及部分说明

需要注意的是,子进程在继承这些属性和资源时,并不会直接共享父进程中的这些内容,而是复制一份副本。这意味着子进程和父进程在此后可以独立地修改它们各自的副本,而不会相互影响。

#include <stdio.h>
#include <unistd.h>

int main(){
    int x = 0;
    printf("hello wolrd\n");

    pid_t pid = fork();
    if(pid == -1){
        perror("fork error");
        return -1;
    }else if(pid == 0){
        x = 10;
        printf("child &x = %p, x=%d\n", &x, x);
    }else{
        sleep(1);
        printf("parent &x = %p, x=%d\n", &x, x);
    }

    while(1);
    return 0;
}

执行结果

hello wolrd
child &x = 0x7ffc5e25a550, x=10
parent &x = 0x7ffc5e25a550, x=0

从输出结果可以看出,子进程继承了父进程的堆栈,并且可以访问和修改堆栈中的变量。但是子进程和父进程在修改变量时是互不干扰的,它们分别操作自己的堆栈副本。当然包含,父进程中的变量用malloc申请的空间,子进程修改该值,并不影响父进程中该变量的值。所以,使用时,需要在父子进程都释放一遍该空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值