首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

探索父进程和子进程

结论:当我们在命令行输入指令去执行的时候,bash会帮助我们创建一个子进程去执行该指令。子进程出问题不会影响到父进程。...先来认识一下fork函数: fork函数会以调用该函数的进程作为父进程创建一个子进程 创建成功时,会在父进程中返回子进程的PID,在子进程中返回0;如果失败,在父进程中返回-1,没有子进程创建。...一个父进程可以创建多个子进程,为了区分这些子进程,fork函数在创建子进程后,会给父进程返回子进程的pid。子进程只需调用getppid()函数即可找到父进程。...**为什么说子进程和父进程的代码和数据是共享的?**刚刚谈到,子进程创建了属于自己的PCB对象,但是没有代码和数据,因此它只能使用父进程的代码和数据,也就是说父子进程的代码和数据是共享的。...因此fork函数之后程序执行了两次,本质上是父子进程各执行了一次。 创建子进程是为了执行和父进程不同的任务,但是父子进程共享一套代码,因此我们需要给父子进程加一区分,以便于让他们执行不同的任务。

15310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于父进程和子进程的关系(UAC 绕过思路)

    假设是a进程创建了b进程,那么a进程就是b进程的父进程。...IceSworld,Process Explorer等) 查看时,会发现提权的进程的父进程是创建它的进程,这是由于AIS利用了CreateProcessAsUser() API中的一个新的功能,这里的新功能就是将提权进程的父进程设置成创建该进程的进程...,假设我们利用一下该API,我们就能够将自己的进程的的父进程设置为随意进程(要提权绕过UAC的鸽子注意了),假设把木马进程的父进程设置为 杀软 的ID或者csrss.exe ,notepad.exe 等可信进程..., 这就是有扩展启动信息的结构体, 这里的IpStartupInfo參数须要填好STARTUPEX 结构,这个结构由STARTUOINFO结构和PROC_THREAD_ATTRIBUTE_LIST 指针构成...假设你调试的程序检測父进程,直接用以上的办法启动它,当然父进程就是他检測同意的父进程喽, 这里启动时要注意的是设置CREATE_SUSPEND 就是创建挂起,然后在创建后使用ResumeThread恢复就能够顺利调试了

    1.7K30

    Linux中父进程为何要苦苦地知道子进程的死亡原因?

    白发人送黑发人 一个普遍的常识是,在Linux里面总是“白发人送黑发人”,子进程死亡,父进程透过wait()等待子进程死亡,并清理子进程僵尸,当然父进程也可以因此而获得子进程的死亡原因。...上述代码中,子进程在第18行通过pause()等待信号,父进程在代码的第22行通过waitpid()等待子进程的结束。其中的参数status是一个输出参数,可以获得子进程死亡的原因。.../a.out child process id: 3320 然后用信号2去杀死这个子进程3320: kill -2 3320 父进程waitpid()返回,然后status里面获知原因,父进程打印:...则父进程探测到子进程死亡后,可打印它的退出状态: $ ..../a.out child process id: 3362 child process exits, status=1 由此可以看出,父进程对子进程的死亡和死亡原因是了如指掌。 ?

    2.1K20

    Windows内核之进程的终止和子进程

    它做的事情: 全部打开的句柄被关闭 全部的线程会被终止 进程对象的状态变为终止的,满足全部等待进程结束的线程 进程中全部线程对象的状态变为终止,满足全部等待线程结束的线程 ...进程的终止状态由STILL_ACTIVE变为了进程的返回代码 这个函数是异步的,它告诉操作系统,你要终止某个进程,可是当函数返回的时候,你无法保证进程是否已经被杀死,假设想要确切知道进程是否被杀死...2 进程终止时的情况 进程中全部剩余线程将被终止 进程中指定的用户对象,GDI对象被释放,内核对象被关闭 内核对象的状态编程收到通知的状态 进程的退出代码由STILL_ACTIVE...3 子进程 程序中要实现一段功能一共同拥有3种方法: 调用函数 开辟新线程 开辟新进程 3.1 调用函数 调用函数时很常见的,可是它的缺点是由于在同一个线程中...3.3 开辟子进程 这样有点是既能够保护数据,能够同步运行,也能够等待新进程运行完成再去运行其它进程的代码。缺点是开辟新进程,会造成地址空间的浪费。

    1.7K20

    如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之

    用ps和grep命令寻找僵尸进程 #ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段 我们设定显示字段为...stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数 因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程 运行结果参考如下...Z 12334 12339 /path/cmd 这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程 运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep...-e '^[Zz]'来确认是否已经将僵尸进程杀死 如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行 #kill -HUP 12334...来解决问题 一般可以用top命令发现动态进程表 #top ?

    2.4K20

    L010Linux和androidNDK之linux避免僵尸进程,子进程退出的处理

    L010Linux和androidNDK之linux避免僵尸进程,子进程退出的处理 如果你在程序中fork出一个子进程,没有好好处理子进程退出后的相关事宜,那么就有可能召唤出传说中进程界的僵尸---僵尸进程...如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,...异步回收僵尸进程: fork()之后,子进程从父进程获取了一份拷贝,和父进程分别独立运行,僵尸进程的产生是因为父进程没有给子进程“收尸”造成的,又可以根据危害程度分为下述两类: 总体来说:当子进程结束之后...,但父进程未结束之前,子进程将成为僵尸进程。...(1)当子进程结束之后,但父进程未结束之前,子进程将成为僵尸进程,父进程结束后僵尸被init进程回收。

    3.1K40

    golang子进程的启动和停止,mac与linux的区别

    简单调试后就找到了原因,在系统中启动的子进程,发出终止信号之后居然仍在运行,导致父进程也一直无法退出,尴尬了。...,表示某个子业务开始工作,然后延时10秒钟之后,把这个子进程杀死。...这段代码启动子进程和关闭子进程在mac电脑的原有系统上工作都很正常,但是到了linux,启动子进程仍然没有问题,关闭子进程不成功。...检查了一下在linux的工作过程,发现启动子进程之后,实际上是启动了两个进程,一个进程是/bin/sh,随后sh又启动了一个子进程自身的子进程sleep。...sh启动了另外一个子进程,这种方法就无效了(指在linux无效,mac测试是一样可以用的,关键区别同样是在mac,/bin/sh进程不会保留并等待我们启动的子进程退出,所以退出消息可以正常的发送到正常的子进程

    4.7K50

    如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?

    问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!.../bin/bash for i in `seq 0 9`; do calculations $i & done wait 上述脚本将会等待所有 10 个被创建的子进程结束,但它总会给出退出状态 0...我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1?...回答 根据 Luca Tettamanti 和 Gabriel Staples 的回答,编写一个完整的可以运行的演示代码: #!...# 存储上一个子进程启动的 pid echo " pid = ${pids[$i]}" done for pid in $pids; do wait $pid rc=$?

    11600

    【Hadoop】万字长文详解Yarn资源隔离

    控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性。 子系统(subsytem)。一个子系统就是一个资源控制器,比如 cpu 子系统就是控制 cpu时间分配的一个控制器。...在创建一个子进程时,JVM采用了"fork()+exec()"模型,这意味着进程创建之后、执行之前会复制一份父进程内存空间,进而使得进程树在某一小段时间内存使用量翻倍。...也就是说,一个子进程刚刚产生时,它的堆栈空间和父进程是完全一致的,那么从一开始它就拥有和父进程同样的ru_maxrss,如果父进程的ru_maxrss比较大,那么由于rusage计算值取最大值,就算在触发写时复制后...Java创建子进程时采用了“fork() + exec()”的方案,子进程启动瞬间,它的内存使用量与父进程是一致的,exec系函数,这个系别的函数通过将当前进程的使用权转交给另一个程序,这时候进程原有的所有运行堆栈等数据将全部被销毁...默认情况下,物理cpu和虚拟cpu是1:1的,如果你的集群是异构的,某些节点上的CPU拥有更强的计算能力,则可以调整物理cpu和虚拟cpu的比例。

    1.2K11

    OOM Killer的一点分析

    了一堆子进程,每个子进程又分配了大量内存,则即使这个父进程本身没有分配什么内存,父进程的point值还是可能大于子进程。...即dmesg显示要kill某个进程(上例中为23009)和其子进程,最终却只kill了另外一个进程(23012)的原因。...对于另一个问题,为什么epoll进程没有被kill掉,而总是worker进程被kill掉,从上面的分析也可以得到大概的解释,对于worker子进程来说,被kill掉是因为本身有内存泄漏,确实占用了大量内存导致...,而对于worker的守护进程来说,则是由于其fork了worker子进程,导致在计算point的时候,子进程的一半内存大小被计算到守护进程的point中,使得守护进程在本身没有泄漏和占用大量内存的情况下...不过这里还有一点存疑,按照上面的分析,即使是在选中父进程的情况下,只要能够kill掉一个子进程,则OOM Killer就会退出,简单的测试程序测试的结果也的确如此,那为什么现网会出现父进程也被kill掉的情况呢

    2.2K40

    阿里前端一面必会面试题(附答案)

    z-index属性在下列情况下会失效: 父元素position为relative时,子元素的z-index失效。...、用户交互、子进程管理,同时提供存储等功能。...因为事件在冒泡过程中会上传到父节点,父节点可以通过事件对象获取到目标节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件,这种方式称为事件委托(事件代理)。...使用事件委托可以不必要为每一个子元素都绑定一个监听事件,这样减少了内存上的消耗。...并且使用事件代理还可以实现事件的动态绑定,比如说新增了一个子节点,并不需要单独地为它添加一个监听事件,它绑定的事件会交给父元素中的监听函数来处理。

    36430

    Linux系统 —— 进程系列 - 进程的概念,PCB与PID和fork

    ,填好之后就有了一个对应的节点,而这里每一个节点都有对应的指针可以指向对应的代码和数据 与此同时,我们对应的每个节点当中,它的指针还可以指向它的下一个节点,最终在操作系统内我们形成了一个程序列表...,这说明父进程和子进程是同时进行的,并且id > 0, 和 id == 0同时成立, 如果在其他的代码中, 这两种情况不可能同时存在,但是在调用的fork下就可以 所以在我们fork之后所有的代码都是共享的...在我们的操作系统里,我们的父进程比上子进程是1:N的,简单来说就是任何一个父进程可以有一个或者多个子进程 所以我们在创建子进程时,一定要把子进程的pid返回给父进程,因为父进程需要通过返回的不同的...) 子进程就被创建出来了, 然后执行流就变成了两个(可以使用if或者else或者else if来进行分流), 一个子进程的执行流, 一个父进程的执行流 也就是说, 这个时候的return语句,...进程具有独立性,简单来说就是一个进程挂掉了并不会影响其他进程,哪怕是父进程挂掉了也不会影响子进程 如果子进程和父进程公用一个数据块, 当子进程改变数据的时候, 父进程也会改变数据,所以 不能让父进程和子进程共享一份数据

    12010

    C语言第四章(进程间的通信,管道通信,pipe()函数)

    一种简单的利用管道进行进程间通信的方法是,创建一个子进程。子进程调用 fork() 函数,将自己的标准输出重定向到管道读端口,然后调用 exec() 函数来运行另一个可执行文件。...; exit(1); } // 创建子进程,使得父进程和子进程都能共享管道。...在父进程和子进程之间,父进程调用 fork() 函数创建了一个子进程。该程序基于尽可能少的关系来实现进程间通信。 父进程关闭管道的写入端口,只保留读取端,以便从子进程中读取数据。...然后通过 fork() 函数创建一个子进程。在父进程中,通过 write() 方法向管道里面的写入端发送数据;而在子进程中,则通过 read() 从管道里面的读取端获取数据。...分析运行结果: 在上述代码中,创建了一个包含两个端点的管道 fd ,然后通过 fork() 函数创建了两个子进程:父进程和子进程。

    9310

    Liunx:理解进程概念

    我们都知道其实bash命令行的作用一方面是解释命令,另一方面是为了阻止用户的非法操作,而我们每一条指令或者是可执行程序其实都是一个进程,因此我们的bash命令行其实是先创建了一个子进程去执行对应的指令,...之所以会多此一举搞一个子进程,其实是为了让父和子同时执行不同的事情——>因此我们就要想办法让父和子执行不同的代码块——>解决方法就是fork要有两个返回值!!...——>所以返回不同的值的意义是为了区分不同的执行流,让父进程和子进程分别执行不同的代码块!! 6.2 fork为什么要给子进程返回0,给父进程返回子进程pid?...因为一个父亲可以有多个子女,但是一个子女只能有一个父亲。所以对于父进程来说他未来可能需要去控制子进程,所以就需要子进程的PID(用来标定子进程的唯一性)。...因为fork函数会创建一个子进程,而进程=内核数据结构(task_struct)+代码+数据,所以首先 1、要先创建一个task_struct的结构体 2、填充该结构体的内容 3、让子进程和父进程指向同样的代码

    7410

    wait和waitpid

    在Linux中,wait 和 waitpid 是用于进程控制的系统调用,它们主要用来让父进程等待子进程的终止,并获取子进程的退出状态。下面详细介绍它们的用法和区别。...总结 wait() 用于简单的父子进程同步,父进程等待任意一个子进程的退出。 waitpid() 提供更多控制,可以指定等待特定的子进程,并支持非阻塞模式和等待停止的子进程。...它们主要用于进程管理和控制,是系统编程中非常重要的工具  1:是什么 2:为什么也就是必要性 之前说过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...Z+(僵尸状态),然后再过5秒,父进程就会用wait给回收掉(wait是只能等待任意一个子进程) 变成Z 回收了 如果有多个子进程呢,wait等待哪一个呢 首先创建多个子进程,此代码的意思是,父进程进入...因为进程具有独立性,所以要用wait等系统调用 查看子进程错误信息码,和exit返回的值        退出信号(signal) 另一种写法(这里的进程出异常是子进程出异常了,wait failed是父进程调取出异常了

    10410

    如何创建多进程程序?(文末福利)

    来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com 前言 在《对进程和线程的一些总结》已经介绍了进程和线程的区别,但是在C/C++中如何创建进程呢?...或者说如何编写多进程的程序呢? 什么时候需要fork进程 一种可能见到的场景是在服务器程序中,一个请求到来后,为了避免服务器阻塞,fork出一个子进程处理请求,父进程仍然继续等待请求到来。...有的朋友可能常常会记不住返回0的时候到底是子进程还是父进程。这里教给大家一个方法。一个进程可以有多个子进程,但是一个子进程同一时刻最多只有一个父进程。...即fork之后,子进程名义上拥有父进程的副本,但是实际上和父进程共用,只有当父子进程中有一个试图修改这些区域时,才会以页为单位创建一个真正的副本。...本文总结点如下: fork调用一次,返回两次 一个进程可以有多个子进程,但同一时刻最多只有一个父进程 子进程继承了父进程很多属性 父子进程执行的先后顺序不一定 本文仅仅简单介绍了fork,实际上得到子进程之后

    1.7K20
    领券