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

为什么一个打开的子进程不会死?

一个打开的子进程不会死的原因是因为子进程在父进程中被创建后,会独立运行并拥有自己的资源和执行环境。子进程与父进程是相互独立的,它们有各自的内存空间、寄存器状态和文件描述符等。当父进程创建子进程后,子进程会继承父进程的代码段、数据段和堆栈段,然后在独立的进程空间中执行自己的程序。

子进程的生命周期不受父进程的影响,即使父进程退出或终止,子进程仍然可以继续运行。这是因为子进程在创建时会被操作系统接管,并成为一个独立的进程实体。子进程会继续执行自己的程序,直到完成任务或被显式地终止。

子进程的独立性使得它可以在父进程退出后继续执行一些后台任务,或者作为一个独立的服务进程长时间运行。这在实际开发中非常有用,例如在服务器端应用中,可以通过创建子进程来处理客户端请求,从而实现并发处理和提高系统的吞吐量。

需要注意的是,子进程的资源会在其终止时被操作系统回收,以确保系统资源的有效利用。因此,在使用子进程时,需要适时地对其进行管理,避免出现资源泄露或过多的僵尸进程。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云容器服务(TKE):基于 Kubernetes 的容器管理服务,简化容器化应用的部署和管理。产品介绍链接
  • 腾讯云函数计算(SCF):无服务器计算服务,帮助开发者更轻松地构建和运行事件驱动型应用程序。产品介绍链接
  • 腾讯云数据库(TencentDB):提供多种数据库产品,包括关系型数据库、NoSQL 数据库和数据仓库等。产品介绍链接
  • 腾讯云对象存储(COS):安全、稳定、低成本的云端对象存储服务,适用于各种数据存储和应用场景。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!...我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1?.../usr/bin/env bash # 这是一个特殊的 sleep 函数,它将睡眠的秒数作为"错误代码" # 或"返回代码"返回,以便我们可以清楚地看到,实际上 # 我们在每个进程完成时确实获取了它的返回代码...my_sleep() { seconds_to_sleep="$1" sleep "$seconds_to_sleep" return "$seconds_to_sleep" } # 创建一个你想作为子进程运行的命令数组...# 存储上一个子进程启动的 pid echo " pid = ${pids[$i]}" done for pid in $pids; do wait $pid rc=$?

11600

2020-12-11:多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?

当打开文件并设置了O_APPEND标识,内核会共享文件写入游标,保证内容不会被覆盖。...这个问题涉及到 系统底层 ,这就要看 操作 系统, 与 Windows 不同, Linux 允许一个文件在写入的时候被读取(或者在被读取的时候写入)。...Linux 通过文件描述符表维护了打开的文件描述符信息,而文件描述符表中的每一项都指向一个内核维护的文件表,文件表指向打开的文件的 vnode(Unix) 和 inode。...文件锁是与进程相关的,一个进程中的多个线程/协程对同一个文件进行的锁操作会互相覆盖掉,从而无效。...fcntl 创建的锁是建议性锁,只有写入的进程和读取的进程都遵循建议才有效;对应的有强制性锁,会在每次文件操作时进行判断,但性能较差,因此 Linux/Unix 系统默认采用的是建议性锁。

1.6K10
  • 为什么我的子线程更新了 UI 没报错?借此,纠正一些Android 程序员的一个知识误区

    开门见山: 这个误区是:子线程不能更新 UI ,其应该分类讨论,而不是绝对的。...半小时前,我的 XRecyclerView 群里面,一位群友私聊我,问题是: 为什么我的子线程更新了 UI 没报错? 我叫他发下代码我看,如下,十分简单的代码。...他用了 OkHttp 的异步 enqueue 的请求,并在成功后更新了 textView 的 text。 明确一点: okhttp 的同步异步的回调都是在子线程里面的。...那么这样来说,按照我们被一直灌输的原理: 子线程不能刷新UI,上面这段代码妥妥地爆错啊。 而我要说的是: 上面的代码不一定爆错,它还会稳稳的顺利执行。 你十分怀疑了? 你可以尝试下。...如果你的子线程更新代码在满足下面的条件下,那么它可以顺利运行: 修改应用层的 viewRootImpl.java 源码,解除限制 把你更新代码写在 onResume 之前,例如 onCreate 里面

    1.3K70

    Linux进程初识:OS基础、fork函数创建进程、进程排队和进程状态讲解

    , ret: %d\n", getpid(), ret); } sleep(1); return 0; } 4.3、关于fork函数的灵魂三问: 1、为什么给父进程返回子进程的pid,给子进程返回0?...父进程会有多个子进程,但是子进程只会有一个父进程,一对多的关系 2、fork函数为什么会返回两次?...当fork函数被调用时,它会创建一个新的子进程,这个子进程是父进程的一个复制品,它们共享相同的代码段和部分数据段。由于子进程是父进程的一个副本,因此它们都会执行fork函数之后的代码。...X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态 S状态其实与操作系统中的阻塞状态(等待某种资源)是一致的!!! D状态深度睡眠又是什么呢?和S睡眠有什么区别?...相当于给进程一个免死金牌,我们要知道在Linux环境下,在操作系统逼急的时候,是会杀掉进程!如果这个进程很重要,就会造成很大的损失,因此这个D状态就相当于给了进程一个免死金牌,不会被进程所杀掉。

    14910

    Nginx(4):守护进程,一份nginx实现,一份我的实现,看着拿呗

    此时孤儿进程已经成为无终端的会话组长,但它可以重新申请打开一个控制终端。...为了避免这种情况,可以通过使进程不再成为会话组长来禁止进程重新打开控制终端, 父进程(会话组长)退出,子进程继续执行,并不再拥有打开控制终端的能力。...禁止进程重新打开控制终端 /* 现在,进程已经成为无终端的会话组长,但它可以重新申请打开一个控制终端。...可以通过使进程不再成为会话组长来禁止进程重新打开控制终端,采用的方法是再次创建一个子进程。 这个nginx里面没有实现,不知道是不是没有必要哈,反正个人看自己需要吧。...,第二子进程继续(第二子进程不再是会话组长) exit(0); } // 5)关闭打开的文件描述符 /* NOFILE 为 的宏定义 NOFILE

    1.2K20

    PostgreSQL 熊灿灿一句话够学半个月 之 KILL -9

    同时在这里众多的客户进程还在访问,那么正在进行的事务由并未完全提交的,导致修改的数据但尚未持久化到磁盘的数据丢失的可能 (如同抢红灯,不是每次都会死,但死一次就够了) 2 事务不完整:由于对于PG的process...好了目前我们已经知道,熊总对于KILL -9 为什么深恶痛绝了。 第一个知识点完成,下一个知识点是,那么我没有办法进入到PG中,我怎么在外部对于PG的一些process进行KILL 。...我们稍微 验证一下,打开PG然后对于PG的任意的一个客户的process 进行KILL -9 你就得到所有的PG的子进程都初始化的“奖赏”(下图仅仅KILL一个客户的process后就得到了主子进程的ID...我也不会什么 sar gdb 那么可以试试,PostgreSQL 的 pg_ctl 命令,是一个宝藏,pg_ctl除了可以开启数据库,关闭数据库,重启数据库,或者promote 数据库,等等,他还有一个...,同时数据库系统不会进行重启初始化所有的进程。

    24010

    产品经理必懂的技术术语

    工程师口中的“打印”一词,表示的是一种结果输出,只是这种结果并不会输出到现实世界,只是将程序运行的结果“打印”到命令控制台上。...相比于进程,线程是一个更小的执行单元,一个运行中的应用程序是一个进程,一个进程中可以存在多个线程,每一个子任务都可以理解为是运行中的一个线程。...脚本也是一种被计算机执行的程序,为什么叫脚本呢?可以把脚本理解成拍戏用的剧本,剧本里会按照角色及对白把要拍的戏清晰地列出来,导演和演员会严格按照剧本表演。...这些子任务通常会在新开辟的子线程里执行。执行登录的线程可以称为主线程,执行获取用户信息的线程称为子线程。 在一个登录操作过程中分别执行两个任务,这个过程就叫作异步处理。...异步处理不会造成线程阻塞,相当于各自处理各自的任务。

    82520

    并发编程~先导篇上

    和上面处理一样,只是竞争的强度没那么大了 开了4个窗口,不着急,一人一个窗口妥妥的 ---- 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开两个浏览器就启动了两个浏览器进程...,这也就是为什么有些人为了追求效率过度调用底层,不考虑自己实际情况最后发现还不如用自托管的效率高 僵尸进程是杀不死的,必须杀死父类才能彻底解决它们,下面说说怎么让父进程为子进程‘收尸’ ---- 2.3...如果pid是一个正数,waitpid()请求获取一个pid指定的进程的退出信息 如果pid为0,则等待并获取当前进程组中的任何子进程的值 如果pid为-1,则等待当前进程的任何子进程 如果pid小于-1...print("exec函数族会替换代码,我是不会被执行的,除非上面的出问题了") print("-" * 10) # 父进程执行一次,子进程不会执行if __name__ ==...os.O_WRONLY: 以只写的方式打开 os.O_RDWR : 以读写的方式打开 os.O_NONBLOCK: 打开时不阻塞 os.O_APPEND: 以追加的方式打开 os.O_CREAT: 创建并打开一个新文件

    1.9K80

    1.并发编程~先导篇(上)

    和上面处理一样,只是竞争的强度没那么大了 开了4个窗口,不着急,一人一个窗口妥妥的 ---- 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开两个浏览器就启动了两个浏览器进程...其实僵尸进程的危害真的很大,这也就是为什么有些人为了追求效率过度调用底层,不考虑自己实际情况最后发现还不如用自托管的效率高 僵尸进程是杀不死的,必须杀死父类才能彻底解决它们,下面说说怎么让父进程为子进程...print("exec函数族会替换代码,我是不会被执行的,除非上面的出问题了") print("-" * 10) # 父进程执行一次,子进程不会执行 if __name_...,信息只能有一个传输方向(类似于对讲机) fifo要求读写双方必须同时打开才可以继续进行读写操作,否则打开操作会堵塞直到对方也打开 如果读端全部关闭,管道破裂,进程自动被终止(PIPE也是这样的) 对2...os.O_WRONLY: 以只写的方式打开 os.O_RDWR : 以读写的方式打开 os.O_NONBLOCK: 打开时不阻塞 os.O_APPEND: 以追加的方式打开 os.O_CREAT: 创建并打开一个新文件

    1.5K40

    关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

    :     1,安卓 APP 启动过程,对于Activity 的 onCreate 等生命周期的函数为什么不会因为 Looper.loop()里的死循环卡死而永无机会执行。     ...2,在 1 的基础上,View 的绘制到底是怎样完成的,它又为什么不会因为 Looper.loop()里的死循环卡死而永无机会刷新。     ...随后调用AMS的attachApplicationLocked(...),在这个函数里面,将会进行第一次跨进程通讯,AMS运行在系统进程,而我们的APP是另外一个进程。...对于第一个问题的解析,那么可以参考前序第三点的内容。 第四个问题    如果您有耐心看到这里,非常感谢,可能有朋友会想起 Android 的另外一句名言,子线程不能刷新UI,这样是否和上面说的冲突呢?...而是限制了,如果当ViewRootImpl是由子线程创造的,那么就可以在该子线程中发送更新UI的消息,自然地就能更新了,那么为什么限制呢?

    1.5K50

    宋宝华: 僵尸进程的成因以及僵尸可以被“杀死”吗?

    僵尸不可能被杀死,因为它已经死了,不存在再死一次的问题。死的对立面是活,死者已死。只有活的进程才可能被杀死。...什么是僵尸 首先要明确一点,僵尸进程的含义是:子进程已经死了,但是父进程还没有wait它的一个中间状态,这个时候子进程是一个僵尸。...正常情况下子死,父wait,清理掉子进程的task_struct,释放子进程的PID: ? 编译上述程序,运行,我们看到2个a.out进程: ? 杀死子进程4578,看到父进程的打印: ?...但是如果子进程死了,父进程不执行到wait,比如把上图中的"#if 0"改为"#if 1",杀死子进程后,子进程就会是一个僵尸: ?...我们重新运行,当我们用kill -2杀掉子进程4628后,我们发现4628成为一个僵尸,状态变为Z+,名字上也加了一个棺材[],成为[a.out]: ?

    1.7K20

    【Linux】进程状态

    注意,这里来回挪动的是PCB,而不是该进程的代码。 挂起状态 当一个进程处于阻塞状态时,就以为着该进程在短时间内不会被调度,那么该进程所加载到内存中的代码和数据在短时间内不会被使用。...操作系统说:"这么说,是我的错了,用户信任我,让我来管理整个计算机,我这也是履行我的职责,没有问题吧" 用户说:"这样吧,我以后往这种进程身上挂一块免死金牌,你看见免死金牌就别杀它了" 操作系统说:"没问题...所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。...任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。...所以在LInux退出时,一般不会彻底退出,而是先进入Z状态,Z状态是为了方便后续父进程获取子进程的退出结果。

    14610

    【Linux修炼】8.进程概念

    为了解释挂起状态,我们建立这样一个场景:如果阻塞的进程过多,那么他们是不会被立即调度的,也就是说不会将这些进程从阻塞状态同时转换成运行状态,因为这些阻塞的进程本身也需要彼此之间进程排队。...用户听了他们说的话,却都觉得没什么问题,于是就对操作系统说:下次对于这样的情况,不要杀掉指定的进程,这就相当于给了这个进程一个免死金牌,操作系统也是清楚了具体的规则,同意了,进程和磁盘也表示没问题。...,而这个父进程却不会对其子进程进行及时的回收。...进程切换 在定义之前,我们需要举例引入进程切换的概念,对于我们常用的手机、电脑等,一般只有一个CPU,我们知道一个CPU一次只能运行一个进程,但是我们发现,在电脑上,我们可以在打开PDF的同时,去浏览一些其他网页...,即同一个时间段内,多个进程可以被CPU同时运行,这是为什么呢?

    55600

    Linux :进程间通信之管道

    一、进程间通信 1.1 是什么和为什么 1、进程间通信是什么?? ——>两个或多个进程实现数据层面的交互,但是由于进程独立性的存在,导致通信的成本比较高。 2、既然通信成本高,那为什么还要通信呢??...因为子进程可以做到和父进程看到同一份代码,所以可以尝试让父进程和子进程进行通信!! 创建子进程的时候,pcb和文件描述符表,肯定是要拷贝的,但是并不会创建新的文件!!...用fork来共享管道原理: 站在文件描述符角度-深度理解管道: 问题1:父进程和子进程一个读一个写实现了通信,但是如果其中一方不小心关掉了会不会导致另一方出错呢??...通过信号,其实操作系统会使用13号信号 SIGPIPE kill 掉正在写入的进程 所以为什么我们一般让父进程读子进程写呢??...我们一直往管道里写,管道的大小都不会发生变化 问题1:父子进程可以通过继承看到同一个文件,那两个毫不相关的进程,我怎么知道这俩进程打开的是不是同一个文件呢??

    7810

    Linux:信号的预备和产生

    结论2:即使信号没有产生,我们的进程也要具备处理信号的能力!! 信号的处理能力是属于进程内置功能的一部分!!   问题4:信号产生了,为什么有时候并不会被立即处理??...问题1:为什么要区分前台进程和后台进程呢??为什么前台进程只能有一个呢?? ——>为了区别又谁来获取键盘输入的资格!! 问题2:ctrl+c为什么能杀死前台进程呢??...问题4:为什么bash进程不会被ctrl+c杀死?...(土一点说,异常捕获不是为了让你不死,而是为了让你死个明白,或者死之前托付一些重要的事情。) 问题8:OS明明可以直接干掉进程,他狠起来连自己都可以干,可他为什么不这样做呢??...问题2:core功能看起来还不错,那为什么云服务器默认不打开core功能呢??

    7510

    【Linux】从零开始认识进程间通信 —— 管道

    进程工作也是这样:进程的协同工作需要一个前提提交——通信。通信就是传递数据,控制相关信息 2 进程如何通信 首先 , 我们知道进程是具有独立性的,一个进程的状态不会影响其他进程的运行。...那么为了要通信,不用在写一个新的模块,直接建立一个子进程来通信多简单。子进程会以父进程为模版进行写时拷贝。...也理解为什么进程会默认打开012三个标准输入输出:因为所有进程都是bash的子进程,而bash打开了这三个文件,所以自然就打开了!!!...有个问题:父子既然要关闭不需要的fd那为什么曾经还要打开呢?可以不关闭吗? 如果父进程只打开读写的fd,那么子进程也就只能继承读写的fd,这就坏事了,总得有人写入吧!...那为什么不直接以读写方式打开一个fd呢?这样肯定不可以,子进程继承后也具有读写,也坏事了! 所以不关闭是为了让子进程可以继承下去,到时候关闭不需要的就可以了!

    12700

    Linux系统编程:理解进程进程管理

    一,进程概念 1.正在执行的程序,叫做进程; 2.本质上加载到内存中的程序都叫做进程; 在我们打开电脑之前,我们的文件都是储存在磁盘上的,而当我们打开电脑,第一个要加载的软件就是操作系统本身,然后再次在此基础上...然后自己就可以继续去帮助别的指令创建进程,这样的好处就是一旦子进程崩了,并不会影响bash命令行进程处理其他的指令!...; 6.2fork的返回值分析 fork为什么给子进程返回0,其实对于子进程来说只是一个标识作用,他可以使用ps 查看自己的PID和父进程的PID; fork为什么给父进程返回子进程的PID;因为父进程需要对创建的子进程进行管理...6.6fork语句之前的语句是否还会执行? 答案是不会,但是会发生拷贝到子进程中! 按照推测"执行此处"只会打印一次 为什么出现了两次"执行此处"呢?...Bash自己去执指令, 这样做的好处是即使指令执行失败,Bash也不会收到影响;体现了进程的独立性 这也是Bash为什么叫做解释器的原因;

    5100

    宋宝华: Linux僵尸进程可以被“杀死”吗?

    什么是僵尸 首先要明确一点,僵尸进程的含义是:子进程已经死了,但是父进程还没有wait它的一个中间状态,这个时候子进程是一个僵尸。...正常情况下子死,父wait,清理掉子进程的task_struct,释放子进程的PID: ? 编译上述程序,运行,我们看到2个a.out进程: ? 杀死子进程4578,看到父进程的打印: ?...之后,4578会消失,因为父进程执行到了wait,也知道了子进程是被信号2杀掉的。...但是如果子进程死了,父进程不执行到wait,比如把上图中的"#if 0"改为"#if 1",杀死子进程后,子进程就是一个僵尸: ?...我们重新运行,当我们用kill -2杀掉子进程4628后,我们发现4628成为一个僵尸,状态变为Z+,名字上也加了一个棺材[],成为[a.out]: ?

    2.6K10

    孤儿进程和僵尸进程的概念及进程回收(wait函数及waitpid函数)

    一.孤儿进程 孤儿进程可以理解为一个子进程的父进程英年早逝(父进程先于子进程退出),就将这样的一个进程称为孤儿进程,在linux操作系统上。...我们查证一下init进程的pid是否为1 操作系统为什么要给孤儿进程分配init进程收养孤儿进程? 其目的只有一个,就是为了释放系统资源 进程结束之后,能够释放用户区空间。...(2)子进程需要父进程回收其所占资源,释放pcb。但是父进程不作为,不去释放已经退出子进程的pcb。 (3)这样的子进程变为僵尸进程。 (4)僵尸进程是一个已经死掉了的进程。...父进程处于阻塞状态(陷入死循环)。 再开启另外一个bash窗口,使用ps -aux | grep 3749命令查看僵尸进程的状态。 defunct是已死的,僵尸的意思。...判断子进程是如何死的 (1)正常退出 (2)被信号杀死 (1)WIFEXITED(status):为非0,进程正常结束。

    2K20

    100个Linux命令(7)-进程管理

    user:匹配该用户的进程 -v:给出详细信息 -w, --wait:等待直到该杀的进程完全死透了才返回。...被1425这个进程打开了,后面的修饰符e表示该文件是一个可执行文件。...僵尸态进程表示的是进程已经转为终止态,它已经完成了它的使命并消逝了,但是内核还没有来得及将它在进程列表中的项删除,也就是说内核没给它料理后事,这就造成了一个进程是死的也是活着的假象,说它死了是因为它不再消耗资源...bash命令本身是bash内置命令,在当前shell环境下执行内置命令本不会创建子shell,也就是说不会有独立的bash进程出现,而实际结果则表现为新的bash是一个子进程。...再来说说,为什么后台服务程序可以使用这两个信号。

    1.7K20
    领券