进程的相关操作fork vfork

Redis Lua引擎UAF漏洞CVE-2025-49844深度剖析与复现实践 内存安全是软件系统稳定性的基石,其核心原理在于确保程序对内存的访问始终处于合法、受控的状态。在C/C++等手动管理内存的语言中,Use-After-Free(释放后使用)是一种典型的高危内存安全漏洞,它源于已释放的内存区域仍被程序指针引用,导致数据混乱或程序崩溃。这类漏洞的技术价值在于其往往能突破高级语言的安全边界,直接威胁进程本身,危害等级极高,常见于数据库、浏览器等核心基础设施。在Redis这样的高性能内存数据库中,其内置的Lua脚本引擎为复杂操作提供了强大支持,但同时也引入了沙箱环境下的复杂内存对象生 阅读详情

一、进程的查看(ps  top)

ps指令

top指令

二,进程标识符pid的查看(  getpid()   getppid() )

进程标识符:进程标识符(PID)是一个进程的基本属性,其作用类似于每个人的身份证号码。根据进程标识符,用户可以精确地定位一个进程。一个进程标识符唯一对应一个进程,而多个进程标识符可以对应同一个程序。

0标识系统的调度进程,1表示系统的初始化进程。

函数原型:

        pid_t  getpid(void);//获取当前进程的pid

        pid_t  getppid(void);//获取当前进程的父进程的pid

返回值:

        进程的标识符

用例:

pid_t pid;
pid=getpid();
printf("pid=%d\n",pid);

三、进程的创建(fork()   vfork())

1、fork函数

函数原型:

        pid_t   fork(void);

返回值:

        函数调用成功,函数返回两次,返回值为0,代表当前进程为进程,返回值为非负数,代表当前进程为父进程。调用失败,返回-1。

用例:

 pid_t pid=fork();
 if(pid>0){
        printf("父进程\n");
 }
 else if(pid==0){
        printf("子进程\n");
 }

2、vfork函数

vfork函数需要与exit(),_exit(),_Exit,wait()等函数使用。第四节会讲数进程的退出。

函数原型:

        pid_t   vfork(void);       

返回值:

        函数调用成功,函数返回两次,返回值为0,代表当前进程为进程,返回值为非负数,代表当前进程为父进程。调用失败,返回-1。

用例:

 int i=3;
 pid_t pid=vfork();
 if(pid>0){
        wait(NULL);
        printf("父进程\n");
 }
 else if(pid==0){
        while(i--){
           printf("子进程\n");
        }
        exit(0);
 }

 3、fork与vfork的异同

相同点:二者的用法都一样,返回值也相同。

区别:

        1、在fork中,父进程与子进程公用存储空间,当子进程要对数据段的数据改变时在拷贝一份数据。而在vfork中子进程直接使用父进程的存储空间,不拷贝,此处需要要简单了解一下程序在内存中是怎样存储的。

命令行参数和环境变量
栈
.....................
堆(malloc等开辟的空间)
bss段(未被初始化的数据)
数据段(已经初始化的数据)
代码段(正文内容)

        2、vfork保证子进程先执行,子进程结束后,父进程才执行。fork中子进程和父进程的执行顺序是由系统的调度决定的,谁先执行轮到谁执行了都是系统调度进程决定的。

        下面用代码来展示二者的区别。下面两段代码都在子进程中对变量a的值+1了,但在父进程中a的值却不一样,在fork中,父进程中a的值没有变,在子进程中+1了,变为了11,在vfork语句中,同样在子进程中对a的值+1了,但是父进程的值也变为了11,原因就是上述的区别1。在fork语句中,子进程对变量a的值进行改变时,会拷贝一份在自己的存储空间,此时在父进程和子进程中各有一块区域来存放变量a,是两个变量了。而在vfrok语句中,父子进程共用存储空间,所以子进程改变了a的值,父进程打印出来的a的值也跟着改变了,他们用的是一个a。

fork代码:

int a=10;
pid_t pid=fork();
if(pid>0){
        printf("father  a=%d\n",a);
}
else if(pid==0){
        a++;
        printf("son     a=%d\n",a);
}

运行结果:

father  a=10
son     a=11

vfork代码:

int a=10;
pid_t pid=vfork();
if(pid>0){
        wait(NULL);
        printf("father");
}
else if(pid==0){
        a++;
        printf("son");
        exit(3);
}
printf("\t a=%d\n",a);

运行结果:

son    a=11
father  a=11

四、父进程等待子进程的退出

        在实际的应用过程过,父进程需要知道子进程的状态以及完成情况,所以需要等待子进程的状态。需要使用的函数为wait,waitpid和exit,_exit,_Exit。

僵尸进程:子进程的退出状态不被收集,就会变为僵尸进程。

函数原型:

pid_t   wait(int *status)

 void _exit(int status);

参数说明:

        status是一个整型指针,子进程的退出状态就存放在它所指向的地址中。为NULL时表示不关心子进程的退出状态。

用例:

int a=10;
int *status;
pid_t pid=vfork();
if(pid>0){
        wait(status);
        printf("father  status:%d\n",WEXITSTATUS(status));
}
else if(pid==0){
        a++;
        printf("son");
        exit(3);
}
printf("\t a=%d\n",a);

以上述代码为例,wait会阻塞父进程的运行,wait后面的语句不会执行,直到子进程执行完,exit发送退出状态码,wait收集到这个状态码,父进程才会执行。WEXITSTATUS函数可以解析这个状态码。

自托管AI邮件助手imap-mcp:安全连接Claude与个人邮箱的完整指南 在AI助手日益普及的今天,如何安全地让AI访问个人邮箱数据成为关键挑战。传统方法如直接暴露IMAP/SMTP凭证存在严重安全隐患,而第三方SaaS服务则涉及隐私泄露风险。Model Context Protocol (MCP) 作为一种新兴的标准化协议,为AI工具安全接入提供了解决方案。其核心价值在于实现数据源与AI助手间的安全、标准化交互,特别适用于处理敏感信息的场景。imap-mcp正是基于MCP协议构建的自托管邮件网关,它通过多层安全机制(包括主密钥加密和OAuth令牌哈希化)保护用户凭证,让用户能在 阅读详情

相关推荐

安装Tailscale

如果返回 /usr/bin/tailscale 或类似路径,说明已安装但 sudo 可能找不到它。如果 which tailscale 没有输出,说明安装失败,重新执行安装步骤。Tailscale 的后台服务 tailscaled 必须运行。检查 tailscaled 服务是否运行。检查 tailscale 命令是否存在。

FairLikeSnow的博客 1470

Linux:fork、vfork与进程临界区问题

fork x:在父进程中创建子进程,并从x处开始运行,父子进程并行执行。 join t,y:将t-1,并判断t是否为0,若是,则转到y位置。 fork():创建的子进程拷贝了父进程的数据段(父、子进程执行次序不定)。 vfork():与父进程共享数据段(先执行子进程,当调用exec或exit后父进程才可被调度运行) 防止两个进程同时进入临界区: int c1 = 0, c2 = 0; //c1和...

weixin_40024414的博客 292

fork()和vfork()

Hello,今天Val和大家分享操作系统中关于进程创建有关的内容。一、进程创建背景知识 1、传统Unix操作系统统一对待所有进程: 子进程拷贝父进程所拥有的所有资源,这种方法创建慢且效率低,因为子进程需要拷贝父进程所拥有的所有资源,实际上,子进程几乎不必读或修改父进程所拥有的所有资源,很多情况下,子进程立即调用execve(),并清除父进程仔细拷贝过来的地址空间。 2、 现代Uni

ValDC_Morning的博客 4043

AIDD-人工智能药物设计-构建基于机器学习方法的在线预测平台高准确预测药物诱导骨毒性

在此基础上,提取多种药物分子特征,包括分子指纹(如MACCS、Morgan、RDKit、TopologicalTorsion、AtomPairs与Descriptors)及分子图谱,通过Transformer编码器与神经网络进行机器学习模型训练。最后,将训练好的模型部署为在线Web服务器(BoneToxPD),供用户快速预测药物的骨毒性。本研究不仅在骨毒性预测的准确性方面取得了突破,还在模型解释性方面提供了新的视角,通过注意力机制精准识别出影响骨毒性的关键化学基团,推动药物研发领域更安全、更高效的发展。

itwangyang520的博客 1079

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7134

操作系统进程-概述、fork/vfork、exit/_exit、getpid/getppid、wait/waitpid与exec族函数的介绍

介绍进程及进程的基本操作函数

Are_pro_bald的博客 1218

在 dell precision 7920 tower CentOS 8 Stream 上安裝nvidia驱动程序、Anaconda

简单记录一下如何在实验室dell precision 7920 tower CentOS 8 Stream上安装nvidia显卡驱动。

chen9046的博客 994

Linux的进程详解(进程创建函数fork和vfork的区别,资源回收函数wait,进程的状态(孤儿进程,僵尸进程),加载进程函数popen)

Linux的进程(进程创建函数fork和vfork的区别,资源回收函数wait,进程的状态(孤儿进程,僵尸进程),加载进程函数popen)

m0_64547558的博客 1047

模拟滤波器的基础知识和设计

使用Python实现多种模拟滤波器

faltas的博客 3529

MATLAB - 浮动基座机器人的逆运动学

本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体,也适用于躯干和腿部可在空间自由移动的行走机器人。请注意,刚体树对象表示具有固定基体的刚体树。这意味着刚体树的基体在世界中具有固定的位置和方向。您可以在基体上附加一个 “浮动 ”类型的刚体关节,为具有浮动基体的机器人建模,以用于动态模拟等某些应用。

机器人控制与仿真应用 2439

进程fork、exit及wait函数

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动。 我们通常使用进程的创建、销毁、退出、等函数对进程进行操作。 fork函数 pid_t fork(); // 父进程返回的是子进程的ID,子进程返回的是0 子进程会复制父进程的堆和栈和数据空间,但是共享代码段。代码段实现使用写时复制法,发现有不同的地方再分出一个修改的副本。同时,在fork函数执行之前已打开的文件描述...

weixin_34764432的博客 941

光学设计仿真软件:Code V_(8).场曲和色差校正

通过以上步骤和代码示例,用户可以更好地理解如何在Code V中进行场曲和色差的校正。这些技术不仅有助于提高光学系统的成像质量,还可以为后续的光学设计提供重要的参考。在实际应用中,用户可以根据具体需求选择合适的校正方法和优化策略,以达到最佳设计效果。

kkchenjj的博客 1783

关于fork的个人理解

代码如下所示: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> void sig_child() {     printf...

GoTime_yx的博客 370

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

linux内核 fork,《深入理解Linux内核》do_fork函数

看到进程clone、fork 和 vfork这章时,些许问题不明白,遂百度,粘贴下他人成果如下。一来作积累之用,二来亦可方便他人搜索。clone fork 及vfork最终都是调用do_fork来实现的,根据do_fork所携带参数之不同达到不同的目的1. fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,注意是资源的复制而不是指针的复制,当然,用户也不需要太大担心性能的问题,Li...

weixin_39867200的博客 285

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Linux】一篇文章搞定 进程 及相关操作

文章目录 Linux下进程相关操作 1. 进程概念 1.1 进程基本概念 1.2 Linux下PCB的定义 2.进程查看 3. 进程创建 3.1 fork函数 3.2 vfork函数 3.3 fork与vfork的异同 3.4 写时拷贝技术 4. 进程退出 4.1 exit函数 4.2 _exit函数 4.3 exit与_exit的异

ZZ100861122的博客 216

Linux进程控制-进程创建/终止/等待&封装fork/wait&函数popen/system

进程创建 在linux中fork函数是很非常重要的函数,它是从已存在进程中创建一个新进程,原进程是父进程,新进程是子进程。 #include<unistd.h> pid_t fork(void);返回值:子进程返回0,父进程返回子进程的id,出错返回-1. 进程调用fork,当控制转移到内核中的fork代码后,内核做: 分配新的内存块和内核数据结构给子进程 将父进程部分数据...

qq_41268108的博客 1423

Linux系统编程之进程控制(进程创建,fork函数,进程中止,进程等待,程序替换)

进程创建 fork()------复制,返回值,写时复制 vfork()创建子进程—子进程与父进程共用同一块虚拟地址空间, 为了防止调用栈混乱,因此阻塞父进程直到子进程调用exit()退出或者进行程序替换 vfork创建的子进程不能在main函数中return 0;退出,因为释放资源后,父进程陷入混乱崩溃 fork和vfork的联系 fork和vfork在内核都是调用clone实现进程的创建 ...

LXY的博客 531

APUE8进程控制 fork vfork exec

转载于:https://www.cnblogs.com/jeanschen/p/3616112.html

weixin_30469895的博客 119

进程创建、进程等待、进程终止、进程替换、模拟shell

一:进程创建 fork创建进程 在https://mp.youkuaiyun.com/postedit/81710318博客中简单介绍了用fork创建进程, 用fork创建进程时,子进程复制的是父进程的PCB,包括子进程复制了父进程的虚拟地址空间和页表,所以子进程的数据和父进程的数据虚拟地址相同,由于页表映射,这时子进程和父进程物理内存也相同,但是当子进程的数据发生改变时,系统会为子进程的数据重新分配物...

sophia__yu的博客 1112

进程的那些事--进程控制

创建一个进程pcb,pcb中有一个指针指向虚拟地址空间(内存指针),指向的所以地址都会同页表映射到物理内存中,而代码中的g_val通过映射在物理内存中存储数据,当我们创建子进程,它就会复制子进程,它就会复制父进程(复制了所有的地址,映射关系,页表,若子进程修改g_val的数据,那么他会生成一个新的数据放到物理内存中,若不修改继续使用父进程的数据)。创建一个子进程后,等待子进程的退出,获取子进程的退出状态,避免僵尸进程的产生。返回值:返回值大于0代表退出成功,表示的是退出子进程的pid,出错返回-1。

2301_80148295的博客 857

进程控制笔记(一)

进程具有五种特性: 动态性 并发性 独立性 异步性 结构特性 进程的相关信息: 进程ID:在Linux系统中,每个进程都有其唯一的ID。在linux下编写关于进程的C程序,经常会使用到一个数据类型pid_t,这个类型专门用来定义进程的ID,是一个非负的整数。 进程的状态:三种基本状态分别是运行状态、等待状态、结束状态。还有就绪、挂起和僵尸等状态。 进程的切换:就是从正在运行的进程中收回处理器的使用权,等待运行进程进来时占有此时的处理器。 虚拟内存:在linux系统中,每个进程都运行在各自的

这只猴子没有名字的博客 232

【操作系统】Linux之进程管理一

if(pid==-1) printf("创建进程失败!if(pid==-1) printf("创建进程失败!printf("调用atexit函数错误!

weixin_74154742的博客 545

进程控制

对进程的相关操作: 进程创建, 进程等待, 进程终止 创建进程 vfork函数 vfork创建的进程子进程先运行,子进程不退出父进程不运行,因为父子进程用相同的地址空间 如果不这样会造成栈混乱(子进程excit退出或者程序替换 fork的使用 NAME fork - create a child process SYNOPSIS #include <unist...

阿彬想成为大牛 311

Linux之进程

1.进程的定义 在讨论进程定义之前,我们可以先来了解一下计算机操作系统为什么要引入进程这个概念。 1.1 进程的引入 当计算机系统只有一个程序运行时,称之为单道程序,此时这个程序独占系统中的所有资源,在执行的过程中不受外界的影响;而多道程序在执行时,就是所谓的程序并发执行,即若干个程序同时在系统中执行,这时,这些程序就不可能独占所有的系统资源了,而需要多个程序共享系统的资源,从而导致各个程序在执行...

studyhardi的博客 418

关于进程的一些函数和功能

进程的创建 fork函数 在Linux环境中,创建进程的主要方法是调用以下两个函数: #include<sys/types.h> #include<unistd.h> pid_t fork(void); pid_t vfork(void); 创建一个新进程 pid_t fork(void) 功能: fork()函数用于从一个已存在的进程中创建一个新进程,新进程成为子进程,原进程成为父进程; 返回值: 成功:子进程中返回0,父进程中返回子进程ID。 失败:返回-1。 使用fork函数

yuanyuan320的博客 397

Linux进程1

ps(显示当前进程),ps -aux(显示进程占用的各种资源)ps -ajx(显示各种的有关ID号)top(显示系统资源使用情况)fork(创建线程),vfork(让子线程先运行)wait(柱塞线程,等待子线程的回应)waitpid(可以使用调用者不柱塞),getpid(获取当前的id),getppid(目前进程的父id)问1.什么是程序,什么是进程,有什么区别?

Y2002168的博客 994
上一篇: Linux对文件的操作(open read write lseek close)
下一篇: 进程间通信——无名管道pipe
init_hello
博客等级 码龄6年 2粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值