fork函数如何创建进程,exit/_exit函数如何使进程终止的详细分析与代码实现

news2025/1/21 18:52:37

🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏

🪔本系列专栏 -  ​​​​​​并发与进程通信

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 - 勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇我见青山多妩媚,料青山见我应如是。📈

目录

fork创建进程

介绍

接口

代码实例

思考

终止进程

exit/_exit函数

接口

代码实例


fork创建进程

介绍

        fork用来创建一个新进程(child proccess),你要创建一个新进程,首先得知道一个进程中都包含上面东西。

        系统数据

        用户数据

        指令

         fork一个新进程时,这个新进程的 数据 和 指令 来源于哪里呢?

                来源于它爸爸(父进程,调用fork的那个进程)

        fork这个函数在创建子进程时,都复制了父进程的哪些内容呢:  

                copy了父进程的数据和指令!!!
                父进程的变量,数据对象,
                标准IO缓冲区
                文件描述符
                ...
                copy完了后,父子进程就独立啦。

            通过fork的不同的返回值,来区分到底是父进程返回,还是子进程返回。

接口

头文件 

            #include <sys/types.h>
            #include <unistd.h>

        函数功能

            创建一个子进程

        函数原型

             pid_t fork(void);

        函数参数

            无

        函数返回值

            如果失败返回-1,同时errno被设置。

            如果成功:  

                父进程返回 子进程的pid( > 0) 

                子进程返回  0

代码实例

        以下是获取自己的进程ID与获取父进程的IP的函数

                头文件 

                #include <sys/types.h>
                #include <unistd.h>

            函数原型 

                pid_t getpid(void);  //用于获取自己的进程pid 
                pid_t getppid(void); //用于获取父进程的pid 

        以下代码实现创建一个子进程,并且父子进程分别输出自己的id。

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
	pid_t pid = fork();
	if(-1 == pid)
	{
		perror("fork failed!");
		return -1;
	}
	else if(0 == pid)	//子进程
	{
		printf("这是子进程,我的ID为%d\n",getpid());
		printf("这是子进程,我的父进程ID为%d\n",getppid());
	}
	else if(pid > 0)
	{
		printf("这是父进程,我的ID为%d\n",getpid());
		printf("这是父进程,我的子进程ID为%d\n",pid);
		printf("这是父进程,我的父进程ID为%d\n",getppid());;
	}
	return 0;
}

思考

        (1) fork一旦成功,就会有父进程和子进程,那么fork之后,到底是父进程先执行,还是子进程先执行呢?

        (2)fork子进程会拷贝父进程的指令和数据,它到底拷贝了父进程哪些数据呢? 

                    a:父进程全部的用户数据
                    b:父进程打开的文件描述符及状态
                    c:标准IO的缓冲区  
                    d:信号的处理方式

         (3)fork之后的子进程与父进程有什么区别?

                进程ID不同。子进程可以通过getpid()函数获取自己的进程ID,可以通过getppid()函数获取父进程的进程ID。
                子进程中的tms_utime tms_stime tms_cutime 和 tms_ustime的值设为0。
                子进程不继承父进程设置的文件锁,但继承了父进程中的所有互斥锁、读写锁和条件变量(包括它们的状态)。
                子进程拥有自己独立的地址空间,但是在fork之后exec之前两个进程用的是同一份物理页面。
                子进程的执行顺序和父进程是不确定的,取决于系统调度。

终止进程

        进程的终止一般有两种情况:第一是自己退出,常见的方法为main函数返回值,程序退出。第二种情况就是调用一些进程退出函数执行终止进程,例如exit/_exit函数与wait/waitpid函数。接下来外面就重点来讲解这两类程序退出函数。

exit/_exit函数

        exit函数和_exit函数都是用来终止进程的,但它们有以下区别:

                exit函数在终止进程之前,会先执行一些清理操作,比如调用atexit注册的函数,刷新所有文件缓冲区,关闭所有打开的文件描述符,销毁线程本地对象等。_exit函数则直接进入内核,不做任何清理操作。

                exit函数的参数是一个无符号整型,表示进程的退出状态,只有第八位有效(0-255),超出255将表示未定义退出状态值。_exit函数的参数是一个整型,表示进程的退出状态,但不一定是0-255。

                exit函数是标准C库函数,定义在<stdlib.h>头文件中。_exit函数是POSIX系统调用,定义在<unistd.h>头文件中。

接口

        头文件 

                     #include <stdlib.h>

                函数功能 

                    让进程退出,正常退出,做一些清理工作(如:把缓冲区的内容,同步到文件中去)

                函数原型

                    void exit(int status);

                函数参数

                    int status    //表示退出码,表示退出状态,退出码的具体含义,由程序员来解释。    
                函数返回值 

                    无


                头文件  

                     #include <unistd.h>

                函数功能

                    _exit 坐火箭走的,让中止进程,来不及做清理工作

                函数原型 

                     void _exit(int status);

                函数参数  

                    int status    //表示退出码,表示退出状态,退出码的具体含义,由程序员来解释。

                函数返回值

                    无

代码实例

        你可以使用命令行参数来指定文件名和打开模式,然后根据模式来调用exit()函数或_exit()函数。例如,你可以输入./a.out test.txt w来打开test.txt文件并写入内容,或者输入./a.out test.txt r _exit来打开test.txt文件并读取内容,然后调用_exit()函数。

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

int main(int argc, char *argv[])
{
    if (argc < 3) // 检查命令行参数是否足够
    {
        printf("Usage: %s filename mode [exit_mode]\n", argv[0]); // 输出用法提示
        return 1;
    }
    char *filename = argv[1]; // 获取文件名
    char *mode = argv[2]; // 获取打开模式
    char *exit_mode = argv[3]; // 获取退出模式
    FILE *fp = fopen(filename, mode); // 打开文件
    if (fp == NULL) // 检查文件是否打开成功
    {
        printf("Cannot open file %s\n", filename); // 输出错误信息
        return 2;
    }
    if (strcmp(mode, "w") == 0) // 如果是写入模式
    {
        printf("Writing to file %s\n", filename); // 输出提示信息
        fprintf(fp, "Hello, file!\n"); // 写入内容到文件
    }
    else if (strcmp(mode, "r") == 0) // 如果是读取模式
    {
        printf("Reading from file %s\n", filename); // 输出提示信息
        char buffer[100]; // 定义缓冲区
        while (fgets(buffer, 100, fp) != NULL) // 循环读取文件内容
        {
            printf("%s", buffer); // 输出文件内容到标准输出
        }
    }
    else // 如果是其他模式
    {
        printf("Invalid mode %s\n", mode); // 输出错误信息
        fclose(fp); // 关闭文件
        return 3;
    }
    fclose(fp); // 关闭文件
    if (exit_mode != NULL && strcmp(exit_mode, "_exit") == 0) // 如果指定了_exit()函数
    {
        _exit(0); // 调用_exit()函数
    }
    else // 否则
    {
        exit(0); // 调用exit()函数
    }
    
}

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

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

相关文章

【Pytorch基础教程38】torchserve模型部署和推理

note torch-model-archiver打包模型&#xff1b;利用torchserve加载前面打包的模型&#xff0c;并以grpc和http等接口往外提供推理服务启动模型的api服务、curl命令发送http post请求&#xff0c;请求模型服务API&#xff1b;流程和TensorFlow serving流程大同小异 文章目录 n…

人工智能之配置环境教程二:在Anaconda中创建虚拟环境并在VsCode中使用

人工智能之配置环境教程二&#xff1a;在Anaconda中创建虚拟环境安装pytorch并在VsCode中使用虚拟环境 作者介绍一. 在Anaconda中创建虚拟环境1. 进入本地终端1.1 键盘使用**winR**快捷键1.2 输入**cmd**点击**确定**进入windows命令行终端 2. 安装镜像源2.1 添加镜像源 3. 创建…

PowerShell install 一键部署http+用户名密码登录实现文件系统

Apache 前言 Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充&#xff0c;将Perl/Python等…

BUUCTF [第五空间2019 决赛]PWN5

小白垃圾做题笔记而已&#xff0c;不建议阅读。 简书上的大佬有三种解题思路&#xff0c;而我刚开始一种也不会&#xff0c;看了题解后才勉强有了两种。 1.第一种算绕过if吧。 更改dword_804C044中的内容&#xff0c;第二次输出相同的内容&#xff0c;从而绕过if 脚本如下&…

Linux-安装gcc和g++报错降级的解决方法

一、简介 通过sudo apt-get install gcc指令安装g报错。 下列软件包有未满足的依赖关系&#xff1a;gcc : 依赖: gcc-7 (> 7.3.0-12~) 但是它将不会被安装推荐: libc6-dev 但是它将不会被安装 或libc-dev又按照网上的解决办法 &#xff0c;还是报错。 apt-get update apt-g…

ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。

安全防范病毒和间谍软件&#xff0c;银行和网上购物更安全, 网络摄像头和家用路由器使用更安全&#xff0c;阻止黑客访问您的电脑, 让您的孩子网络安全&#xff1b;产品兑换码仅支持中国ip地址兑换&#xff0c;兑换后可全球通用。 简单&#xff0c;可靠的防护 防范黑客&#x…

【C++11】新的类功能、可变参数模板

C11——新的类功能、可变参数模板 文章目录 C11——新的类功能、可变参数模板一、新的类功能1.测试代码2.默认成员函数3.类成员变量初始化4.强制生成默认函数的关键字default5.禁止生成默认函数的关键字delete6.继承和多态中的final与override关键字 二、可变参数模板1.可变参数…

第64章 树型结构数据的前端渲染渲染显示示例

1 \src\views\TreeTestView.vue <template> <div class"wrap"> <!--注意&#xff1a;1、“回到顶部”组件及其回滚内容都必须包含到同1个div容器中。--> <!-- 2、div容器中必须有1个唯1性的样式类&#xff08;例如&#xff1a;wrap&#xff09…

【Kubenetes进阶】Helm3保姆级安装与Chart使用

之前在Centos 7_64位上实现了用kubespray-2.15.0完成kubenetes的部署&#xff0c;对于kubenetes&#xff0c;Helm无疑是一个良好的命令行下的客户端工具。Helm主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。 需要对helm加深了…

安全狗云安全资源池为运营商行业云降本增效

随着政府大力促进数字化转型&#xff0c;网络安全作为数字化建设的安全基石&#xff0c;已然成为保障数字化过程中稳定运行的重要因素。 一 严峻挑战下用户亟需安全托管专业服务 1) 云计算虚拟化的存储、部署及运作模式&#xff0c;数据所有权与管理权分离等特点&#xff0c…

【iOS】—— KVO再学习

KVO 文章目录 KVOKVO概念KVO使用步骤注册KVO监听KVO监听实现移除KVO监听 KVO基本用法KVO传值禁止KVO的方法使用注意事项 KVO原理GSKVOInfoGSKVOPathInfoGSKVOObservation为什么要重写class方法呢&#xff1f; GSKVOReplacementGSKVOBaseGSKVOBase小结 源码实现移除观察者总结 K…

unity Shader实现半透明阴影

在shader中&#xff0c;要对移动端的兼容&#xff0c;还不想实现两套分开兼容的话&#xff0c; #pragma exclude_renderers gles gles3 glcore #pragma target 4.5这两句话一定要改掉&#xff0c;第一行代码直接剔除了gles的渲染&#xff0c;而恰恰大部分移动端都是用的gles&a…

第十七章 访问者模式

文章目录 前言一、访问者模式基本介绍二、访问者模式应用实例完整代码评测抽象类 Action成功评价 Success失败评价评价人抽象类男性女性数据结构&#xff0c;管理很多人评价Clint 测试添加 wait 选票clint 测试 三、访问者模式的注意事项和细节 前言 一、访问者模式基本介绍 二…

Vue2 脚手架下载及配置淘宝镜像--和ieda的配置和打开

目录 Vue2 脚手架下载及配置淘宝镜像 为什么需要 Vue Cli 脚手架? 环境配置&#xff0c;搭建项目 1. 搭建 Vue2 脚手架工程&#xff0c; 2.查看 3.冲突 4. 下载 5. 安装 6. 验证 7. 先删除以前的 cli 版本<不论是之前未下载或没有下载> 8. 安装淘宝镜像-cnpm…

20230427配置cv1826的buildroot在串口免登录的方法二

20230427配置cv1826的buildroot在串口免登录的方法二 2023/4/27 16:46 进度&#xff1a;可以拿掉密码&#xff0c;但是无法拿掉用户名&#xff01; 1、 Z:\buildroot1\buildroot\configs\cvitek_cv182x_defconfig BR2_TOOLCHAIN_EXTERNAL_GCC_6y BR2_TOOL…

编译一个魔兽世界开源服务端Windows需要安装什么环境

编译一个魔兽世界开源服务端Windows需要安装什么环境 大家好我是艾西&#xff0c;去年十月份左右wy和bx发布了在停服的公告。当时不少小伙伴都在担心如果停服了怎么办&#xff0c;魔兽这游戏伴随着我们渡过了太多的时光。但已经发生的事情我们只能顺其自然的等待GF的消息就好了…

Selenium基础篇之键盘操作(一)

文章目录 前言一、常用方法(上)二、小剧场2.1场景2.2代码2.2.1引入库2.2.2启动浏览器实例2.2.3访问C站首页2.2.4窗口最大化2.2.5获取输入框元素2.2.6向输入框输入文字2.2.7使用退格键删除最后一个字符2.2.8全选输入框文字2.2.9剪切输入框文字2.2.10粘贴文字到输入框2.2.11回车查…

经验分享 | 科研行业如何搭建RASP防护体系?

多年来&#xff0c;开源网安长期服务金融、政府、科技等大型企业&#xff0c;针对不同实际应用场景&#xff0c;打造出了成熟落地的解决方案&#xff0c;提高并完善了企业安全防护技术与管理体系。今天&#xff0c;我们就来了解开源网安是如何为科研行业搭建RASP防护体系的。 科…

“ ES6+ —— 让你的JavaScript代码从平凡到精彩 “

前期回顾 【提高代码可读性】—— 手握多个代码优化技巧、细数哪些惊艳一时的策略_0.活在风浪里的博客-CSDN博客代码优化对象策略https://blog.csdn.net/m0_57904695/article/details/128318224?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%…

GQCNN

Berkeley AUTOLAB’s GQCNN Package — GQCNN 1.1.0 documentation (berkeleyautomation.github.io) (3条消息) 机器人抓取&#xff08;六&#xff09;—— 抓取点检测&#xff08;抓取位姿估计&#xff09; gqcnn代码测试与解读_zxxRobot的博客-CSDN博客 GQ-CNN模型对生成数据…