fork函数相关资源复制问题验证

news2024/11/26 10:45:32

前言

        fork是什么?克隆当前的进程,然后创建一个子进程。本文分几个验证实例代码,主要是为解决验证一些小问题。

一 fork与文件描述符

fork之前打开一个文件的测试。

问题:fork之后,父进程关闭文件,子进程是否还可以正常写文件?

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int fd;
    char buf[100];
    int count = 0;
    int pid;
    fd = open("hello.txt",O_RDWR|O_CREAT,0666);
    if(fd < 0){
        perror("open");
        return -1;
    }
    printf("open ok\n");
    pid = fork();
    if(pid == -1){
        perror("fork");
        exit(-1);
    }
    if(pid > 0){
        printf("parent:pid = %d\n",getpid());
        close(fd);
    }else{
        while(1){
            sprintf(buf,"count = %d\n",count++);
            write(fd,buf,strlen(buf));
            sleep(1);
        }
    }
    while(1)
    sleep(1);
    return 0;
}

        这个程序得出的结果是,子进程会不停的向文件中写内容,即便父进程关闭了fd。这说明,fork执行以后,子进程继承了父进程的资源。并且继承了文件描述符,子进程与父进程在fork以后,就是两个不同的进程了。

这时,杀死父进程,子进程将被系统进程接管。

杀死子进程呢?子进程将变成僵尸进程。如何处理僵尸进程呢?暂时先不讨论这个问题。

二 fork与线程

fork之前创建一个线程。

问题:fork之后,子进程是否拥有一个该线程的复制?

测试实例:fork.c

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

void * mythread(void *arg)
{
    while(1){
        printf("pid = %d\n",getpid());
        sleep(1);
    }
    return NULL;
}

int main()
{
    int fd;
    char buf[100];
    int count = 0;
    int pid;
    pthread_t t;
    fd = open("hello.txt",O_RDWR|O_CREAT,0666);
    if(fd < 0){
        perror("open");
        return -1;
    }
    printf("open ok\n");
    pthread_create(&t,NULL,mythread,NULL);
    pid = fork();
    if(pid == -1){
        perror("fork");
        exit(-1);
    }
    if(pid > 0){
        printf("parent:pid = %d\n",getpid());
        close(fd);
    }else{
        while(1){
            sprintf(buf,"count = %d\n",count++);
            write(fd,buf,strlen(buf));
            sleep(1);
        }
    }
    while(1)
    sleep(1);
    return 0;
}

编译

gcc fork.c -pthread

 测试结果:

lkmao@ubuntu:~/01$ ./a.out
open ok
pid = 124353
parent:pid = 124353
child:pid = 124355
pid = 124353
pid = 124353
pid = 124353
pid = 124353
pid = 124353
pid = 124353
pid = 124353
pid = 124353
pid = 124353
pid = 124353
pid = 124353

 执行pstree -p命令:

 {a.out}124354,就是创建的线程,它只有一个。

三 fork与malloc

fork之前使用malloc分配内存。fork之后,父进程free这块内存,请问,子进程是否还有该内存的使用权?

一句话:每个进程都拥有,且独立使用4GB的虚拟内存空间。还像是这么说的。

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

void * mythread(void *arg)
{
    while(1){
        printf("pid = %d\n",getpid());
        sleep(1);
    }
    return NULL;
}

int main()
{
    int fd;
    char* buf;
    int count = 0;
    int pid;
    pthread_t t;
    fd = open("hello.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
    if(fd < 0){
        perror("open");
        return -1;
    }
    printf("open ok\n");
    buf = malloc(100);
    pthread_create(&t,NULL,mythread,NULL);
    pid = fork();
    if(pid == -1){
        perror("fork");
        exit(-1);
    }
    if(pid > 0){
        printf("parent:pid = %d\n",getpid());
        free(buf);
        close(fd);
    }else{
        printf("child:pid = %d\n",getpid());
        while(1){
            sprintf(buf,"count = %d\n",count++);
            write(fd,buf,strlen(buf));
            sleep(1);
        }
    }
    while(1)
    sleep(1);
    return 0;
}

这个测试结果和实例1一样。

这样验证可能还是不太好,从新写验证代码,fork之前对buf赋值 "count = 0",fork之后,父进程修改buf。然后,子进程等待1秒,然后子进程打印buf,思考子进程打印的buf是什么?不用想的看结果吧。

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>


int main()
{
    char* buf;
    int count = 0;
    int pid;
    pthread_t t;
    buf = malloc(100);
    sprintf(buf,"count = %d\n",count++);
    pid = fork();
    if(pid == -1){
        perror("fork");
        exit(-1);
    }
    if(pid > 0){
        printf("buf = %p\n",buf);
        printf("parent:pid = %d\n",getpid());
        sprintf(buf,"pid = %d\n",getpid());
        printf("parent buf:%s\n",buf);
    }else{
        sleep(1);
        printf("buf = %p\n",buf);
        printf("child:pid = %d\n",getpid());
        printf("child buf:%s\n",buf);
    }
    while(1)
    sleep(1);
    return 0;
}

测试结果:虽然父子进程的buf地址相同,但是父子进程的buf中的内容,是完全不同的。这就是为什么说,每个进程的虚拟地址空间独立的原因吧。

lkmao@ubuntu:~/01$ gcc fork.c
lkmao@ubuntu:~/01$ ./a.out
buf = 0xe01010
parent:pid = 126902
parent buf:pid = 126902

buf = 0xe01010
child:pid = 126903
child buf:count = 0


 

小结

        暂时想到这几个问题,关于如何处理僵尸进程呢?这个问题,下次研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14天学习训练营导师课程-Pygame学习笔记-Part1(环境准备)

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 学习知识点 学习先从环境安装和配置开始&#xff1a; 环境安装…

微积分在金融投资的应用

目 录 摘 要 I ABSTRACT II 1绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 1 1.3微积分发展概述 2 1.3.1微积分学的创立 2 1.3.2微积分诞生的重要意义 3 1.3.3微积分理论内容介绍 3 1.3研究主要内容 4 2微积分在金融投资中的应用 5 2.1导数在金融投资中的应用 5 2.1.1导数在金…

Springboot疫苗接种管理系统-JAVA.JSP【数据库设计、源码、开题报告】

摘 要 预防预接种工作实行网络信息化管理&#xff0c;是我国免疫规划工作发展的需要。接种信息实行网络信息化不仅是预防接种工作步入了一个新的台阶&#xff0c;更重要的是解决了多年疫苗接种过程种&#xff0c;免疫接种剂次不清&#xff0c;难以全程有效接种的问题&#xff…

SpringBoot + openFeign实现远程接口调用

SpringBoot服务之间通过openFeign实现远程接口调用 现在的微服务项目不少都使用的是springbootspring cloud构建的项目&#xff0c;微服务之间的调用都离不开feign来进行远程调用。那么我们一个服务需要调用第三方的服务的时候&#xff0c;我们常常可能使用httpclient或者rest…

正大国际期货:2022正大期货在国际市场热度不减的几点原因

2022年国际期货是金融行业重点关注的对象&#xff0c;从今年市场数据中可以看出&#xff0c;正大国际期货之所以还能一如既往领跑&#xff0c;每年交易量都在递增&#xff0c;和正大后台的实力雄厚&#xff0c;坚守合作互赢的理念重大相关&#xff0c;接下来重点说说正大国际越…

【ML-SVM案例学习】svm实现手写数字识别

文章目录前言一、源码分步解析1.引入库2. 设置属性防止中文乱码3.加载数字图片数据4.获取样本数量&#xff0c;并将图片数据格式化5.模型构建6.测试数据部分实际值和预测值获取7.进行图片展示8.把预测错的值的 x值 y值 和y的预测值取出9.通过enumerate&#xff0c;分别拿出x值 …

Java的三大特性之继承

封装详见&#xff1a;Java的三大特性之封装 多态详见&#xff1a;Java的三大特性之多态 1.认识继承 继承的本质是对某一批类的抽象&#xff0c;从而实现对显示世界更好的建模。 extends “扩展” 子类是父类的扩展&#xff0c;子类继承了父类&#xff0c;就会有父类的全部方法…

强推这款键盘利器(Keychron),这次我彻底入坑了

嗨喽&#xff0c;大家好。还记得我今年五月份的时候&#xff0c;发布了一篇关于自己使用键盘的文章——>程序猿必备键盘推荐&#xff08;Keychron&#xff09;&#xff0c;实用炫酷两不误&#xff0c;这篇文章发布后引起了强烈的反响。身边的同学、朋友&#xff0c;包括一些…

Ubuntu20.4系统隐藏顶栏

注&#xff1a;Ubuntu20.4以上版本安装gnome-tweak-tool可以实现隐藏顶栏了&#xff0c;但20.4还需要安装一下扩展模块&#xff0c;教程如下&#xff1a; 在Ubuntu中有两个扩展工具都支持隐藏顶栏。 1、安装autohidetopbar。 sudo apt install gnome-shell-extension-autohid…

【web】JavaScript——Web APIs笔记小结 dom 样式属性(自定义属性+节点操作部分)

期中考完回来更新了 感觉进度真的好慢T^T&#xff0c;已经摸了快一个月的鱼了qwq&#xff01;&#xff01;&#xff01; 来源&#xff1a;JavaScript基础语法-dom-bom-js-es6新语法-jQuery-数据可视化echarts 目录 ⑦H5自定义属性 V.节点操作 ①节点层级 ※※父级节点 ※…

react事件系统(新老版本)

带着问题阅读探索 React 为什么有自己的事件系统&#xff1f;什么是事件合成 &#xff1f;如何实现的批量更新&#xff1f;事件系统如何模拟冒泡和捕获阶段&#xff1f;如何通过 dom 元素找到与之匹配的fiber&#xff1f;为什么不能用 return false 来阻止事件的默认行为&…

SpringCloudGateway--自动路由映射

目录 一、GateWay项目创建 二、子项目创建 三、测试调用 一、GateWay项目创建 首先启动本地nacos&#xff0c;具体可参考&#xff1a;Nacos Windows安装_雨欲语的博客-CSDN博客 新建工程项目spring_cloud_test,pom引入依赖&#xff1a; <parent><groupId>org.s…

单片机只会调库和复制别人的代码是什么水平?

单片机只会调库和复制别人的代码是什么水平&#xff1f;前言什么是调库&#xff1f;如何不调库点亮一个LED调库与不调库的区别为什么要操作寄存器结语前言 相信对于学习过单片机的同学对于调库这个操作都不陌生&#xff0c;大家都是从调别人的库阶段过来的&#xff0c;今天看到…

便捷记账本小程序+后台管理系统-JAVA【数据库设计、源码、开题报告】

第一章 绪 论 1.1选题背景 互联网是人类的基本需求&#xff0c;特别是在现代社会&#xff0c;个人压力增大&#xff0c;社会运作节奏高&#xff0c;随着互联网的快速发展&#xff0c;用户的需求也越来越高&#xff0c;用户也将越来越多依靠互联网而不是自己获取信息&#xff…

Go:进度条工具库 vbauerster/mpb 简介

文章目录简介核心能力示例单进度条渲染多进度条渲染小结简介 mpb是一个在终端进行进度条渲染的工具库 核心能力 支持多进度条 Multiple Bars: Multiple progress bars are supported支持动态设置进度条总值 Dynamic Total: Set total while bar is running支持动态增加 / 删…

【Unity Shader】屏幕后处理4.0:基于高斯模糊的Bloom

原本打算写高斯模糊和双重模糊两个实现Bloom方法的对比&#xff0c;但两个加在一起篇幅过长&#xff0c;于是拆成两篇文章来进行。 学习前建议应先搞清楚的几个概念 HDRLDRToneMapping几种模糊算法1 高斯模糊实现Bloom 最近一直在学习Unity Shader实现各种后处理效果&#x…

c++ - 第13节 - c++中的继承

1.继承的概念及定义 面向对象三大特性&#xff1a;封装、继承、多态注&#xff1a;面向对象不止这三个特性&#xff0c;还有其他特性&#xff0c;比如反射&#xff08;Java中的概念&#xff09;、抽象等封装的理解&#xff1a;&#xff08;1&#xff09;将c设计的stack类&#…

记一次艰难的上班历程

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 以下事件均为卢松松真实经历&#xff1a; 早上7点&#xff0c;小区又被静默了&#xff0c;几百号人堵在小区门口。 我不顾病毒传染的风险挤到了小区门口&#xff0c;问原因。 看门的说到&#x…

pumping lemma

正规语言版本 LLL是正规语言,则存在整数p≥1p\ge 1p≥1 对于任意长度大于等于ppp的字符串w∈Lw\in Lw∈L&#xff0c;wxyzwxyzwxyz,满足下面3个条件 ∣y∣≥1\left|y\right|\ge 1∣y∣≥1 ∣xy∣≤p\left|xy\right|\le p∣xy∣≤p ∀n≥0,xynz∈L\forall n\ge 0,xy^nz\in L∀n≥…

1997-2020年各省三废排放量和熵值法计算的环境规制综合指数(无缺失值)

1997-2020年各省三废排放量和环境规制综合指数 1、包括&#xff1a;30个省份 2、指标包括&#xff1a;工业二氧化硫排放量、工业烟尘排放量和工业废水排放量 环境规制综合指数是由工业废水排放量、工业 SO2 排放量以及工业烟尘排放量计算而来 &#xff08;表格中有详细的三…