首页
学习
活动
专区
圈层
工具
发布

【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】

本章主要内容面向接触过Linux的老铁 主要内容含: 1.系统调用接口查看pid,ppid pid:当前进程 ppid:父进程 每一次启动的进程, 系统会重新生成pid ,系统只保证当前生命周期内...pid有效; 但是 父进程不会变 2.为什么ppid父进程id不变?...——bash命令行解释器与bash进程 当我们运行一个进程时,命令行解释器会把这个指令解释成bash的子进程 接着再由这个bash的子进程执行对应的命令 当这个子进程出现问题时,并不影响bash的进程...即:每一条命令被执行,都属于bash的子进程 我们执行一段代码,parent对应的是getppid()函数; 我们接着用ps+grep过滤指令查看这个16815进程,发现其就是bash进程

55110

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

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

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

    【Linux】手把手教你制作一个简易shell——(进程创建fork进程替换wait与进程等待exec的应用)(自定义shell程序设计)

    本章主要内容面向接触过C++ Linux的老铁 主要内容含: 一.前置知识 【1】Shell和Bash简述 Shell 是一种命令行界面,是用户与系统之间的接口,允许用户执行命令来 管理系统资源、...本质是通过 空格 作为分隔符,把一个一个字符串分隔开载入 指针数组中 ; 在父进程bash进程中,创建一个子进程,环境变量也会传递给子进程,并进行 进程等待wait 在子进程中通过...: getUserCommand函数 分割字符串: commandSplit函数 执行对应的命令: execute函数 2.程序设计细节 设置一个命令行获取字符数组:usercommand 设置一个存储...我们回顾原理部分: 在父进程bash进程中,创建一个子进程,环境变量也会传递给子进程,并进行 进程等待wait 在子进程中通过 进程替换exec ,执行 指针数组中 中的命令(通过环境变量)...于是我们设计出: fork函数创建子进程 子进程进行进程替换execvp函数,用到 分割usercommand数组后的字符串的地址——的指针数组argv 父进程等待子进程 2.程序设计细节 1.

    42010

    如何在一个Docker中同时运行多个程序进程?

    我们都知道Docker容器的哲学是一个Docker容器只运行一个进程,但是有时候我们就是需要在一个Docker容器中运行多个进程 那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT...Bash Shell脚本 入口文件运行一个Bash Shell 脚本, 然后在这个脚本内去拉起多个进程 注意最后要增加一个死循环不要让这个脚本退出,否则拉起的进程也退出了 run.sh #!...containers 一个最小化的Linux容器初始化系统 dumb-init是一个简单的进程监控器和init系统,设计为在最小容器环境(如Docker)中作为PID 1运行。...它被部署为一个用C编写的小型静态链接二进制文件。...这就解决了很多没有前台方式启动的程序不能用Supervisor来管理的问题。

    18.4K30

    如何编写一个自动关闭某个进程的脚本,并使用cron定时执行?

    为了避免这种情况的发生,我们可以编写一个自动关闭某个进程的脚本。本文将介绍如何编写一个自动关闭某个进程的脚本,并使用cron定时执行。在本文中,我们将以关闭Java进程为例进行讲解。...编写关闭进程脚本首先,我们需要编写一个用于关闭进程的脚本。我们可以使用kill命令来关闭指定进程。为了实现自动化,我们需要知道进程的PID(进程ID)。我们可以使用pgrep命令来查找进程的PID。...下面是一个简单的关闭Java进程的脚本:#!...设置定时任务一旦我们编写了自动关闭进程的脚本,就可以在Linux系统中设置一个定时任务来定期执行这个脚本。Linux系统提供了一个非常强大的工具,cron,来实现这个功能。...总结在本文中,我们介绍了如何编写一个自动关闭某个进程的脚本,并使用cron定时执行。这种方法可以帮助我们避免由于进程占用过多资源导致服务器性能下降的情况发生。

    2.7K40

    在C#.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载 (1) 在C#/.NET应用程序开发中创建一个基于...本文主要演示在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)。...创建一个演示应用程序 首先,打开之前我们创建的[TopshelfDemoService.sln]解决方案。...编写好后,生成或者运行一下这个项目。你会看到一个控制台应用程序界面,如: ?...应该如何解决呢??? 预知后事如何请听下回分解(未完待续)... 好了,今天的在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)的分享就到这里。

    3.2K20

    【Linux】进程概念(一):基本概念与基本操作

    最后,通过详细的 fork() 示例,探讨了父进程与子进程的关系以及它们如何通过不同的返回值执行各自的任务 基本概念 我们都知道,在编写完一段代码后,点击执行时,代码会被编译并链接成一个可执行文件。...二、task_struct task_struct 是用来描述一个 进程 的重要数据结构。每个进程都有一个对应的 task_struct,它保存了该进程的各种信息和状态。...PID 是进程标识符(Process Identifier)的缩写,是操作系统分配给每个正在运行的进程的唯一编号。每个进程都有一个唯一的 PID,它帮助操作系统和用户区分不同的进程。...每个进程都有一个父进程,除了系统启动时的初始化进程(通常是 init 或 systemd)。PPID 表示的是哪个进程启动了当前的进程。通过查看 PPID,我们可以了解进程之间的父子关系。...每个进程都有唯一的 PID,父进程通过 fork() 返回的 PID 就能知道哪个子进程对应哪个任务,方便后续对特定子进程进行管理。

    18310

    进程优先级介绍,详解环境变量,详解进程地址空间

    如上图中所示: 已知:myenv是个shell定义的普通全局变量,echo是一个指令(本质上也是一种程序),当在shell运行echo时本质创建了一个子进程,但按照环境变量的定义这应该是不被允许的。...echo能读取非环境变量的本质: 三、进程地址空间 1.引出问题 我们编写一段代码,定义一个全局变量glo_x=100,再通过fork调用生成一个子程序。...3)虚拟地址是如何做到的 操作系统通过页表映射,将进程的虚拟地址与物理地址联系起来,以实现每个进程的虚拟地址空间。 四、一些问题 1.如何理解fork函数为父进程返回子进程id,给子进程返回0?...同理,一个子进程只能有一个父进程,故仅通过getppid函数就能知道谁是父进程;但一个父进程可能有多个子进程,所以需要每个子进程的id来区分他们,所以要求创建完子进程后向父进程返回其id。...通过上述“进程地址空间”我们已知:fork调用的效果是创建一个子进程,并将父进程的task_struct(PCB)和代码数据等拷贝一份给子进程,并共享之后的代码。

    32800

    当你在 Linux 上启动一个进程时会发生什么?

    Linux 中的每个进程都存在于“进程树”中。你可以通过运行 pstree 命令查看进程树。树的根是 init,进程号是 1。每个进程(init 除外)都有一个父进程,一个进程都可以有很多子进程。...所以,假设我要启动一个名为 ls 的进程来列出一个目录。我是不是只要发起一个进程 ls 就好了呢?不是的。...我要做的是,创建一个子进程,这个子进程是我(me)本身的一个克隆,然后这个子进程的“脑子”被吃掉了,变成 ls。...它讨论了 Python 如何使信号处理程序忽略了 SIGPIPE。也就是说,如果你从 Python 里运行一个程序,默认情况下它会忽略 SIGPIPE!...这意味着,程序从 Python 脚本和从 shell 启动的表现会有所不同。在这种情况下,它会造成一个奇怪的问题。 所以,你的程序的环境(环境变量、信号处理程序等)可能很重要,都是从父进程继承来的。

    1.5K70

    操作系统-多进程和多线程-python

    如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 模型更复杂,实际很少采用。...多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。...子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。...multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束: 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例...我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据: 在Unix/Linux下,multiprocessing模块封装了fork()调用,使我们不需要关注

    1.5K30

    C语言进程(第二章,wait,sleep,waitpid,pthread_mutex_lock,pthread_mutex_unlock)

    因此,在编写涉及到多个进程的程序时,请务必谨慎考虑并仔细设计系统架构。 在该程序中,首先调用 fork() 函数时,系统将创建一个新的子进程。...例题 例题一 编写一个程序,使用fork()创建两个子进程a和b,从父进程开始a、b执行顺序应为b后于a, 完成之后在屏幕上显示"b输出完毕"。...例题二 编写一个程序,父进程创建5个子进程,并等待每个子进程完成后,计算并输出它们的运行时间。...运行结果: 当该代码运行时,父进程重复调用了五次waitpid()函数来等待每个子进程完成操作,并处理相应的返回状态。 当一个子进程执行完毕后,它退出并返回一个退出状态码给父进程。...因此,通过正确的多进程编写和调试方式,此代码能够有效地创建、管理、控制和处理多个子进程的操作,正确打印并处理每个子进程的输出结果。

    98910

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

    或者说如何编写多进程的程序呢? 什么时候需要fork进程 一种可能见到的场景是在服务器程序中,一个请求到来后,为了避免服务器阻塞,fork出一个子进程处理请求,父进程仍然继续等待请求到来。...有的朋友可能常常会记不住返回0的时候到底是子进程还是父进程。这里教给大家一个方法。一个进程可以有多个子进程,但是一个子进程同一时刻最多只有一个父进程。...即fork之后,子进程名义上拥有父进程的副本,但是实际上和父进程共用,只有当父子进程中有一个试图修改这些区域时,才会以页为单位创建一个真正的副本。...由于子进程是父进程的一个副本,所以父进程有的属性,子进程也都有,这些属性包括 打开的文件描述符 会话ID 根目录 资源限制 工作目录 进程组ID 控制终端 环境 … 我们运行前面的示例程序之后,重新打开一个终端...本文总结点如下: fork调用一次,返回两次 一个进程可以有多个子进程,但同一时刻最多只有一个父进程 子进程继承了父进程很多属性 父子进程执行的先后顺序不一定 本文仅仅简单介绍了fork,实际上得到子进程之后

    1.9K20

    Linux 进程总结

    它的执行需要系统分配资源创建实体之后,才能进行。举个例子:我们所写的程序,在运行的时候它也是一个进程。 进程和程序的区别: 程序相当于是一个文件,是有序代码的集合,是静态的存储在硬盘中。...一个进程中如何创建多个进程 创建进程有两种方式:一种是操作系统创建,另一种是父进程创建。父进程创建的进程(通常称为子进程),它们和父进程存在隶属关系。子进程又可以创建进程,这样形成一个进程家族。...就是父进程先于子进程结束,这时子进程被init进程收养,init的进程号为1。 僵尸进程 当一个子进程终止时,如果它的父进程还在运行,内核会为这个终止的子进程保留一定量的信息。...父进程可以根据这些信息知道子进程的情况。直到父进程对其进行了善后处理,子进程才会完全终止。在这期间,父进程没有回收子进程并释放子进程占用的资源,这个子进程会成为僵尸进程,它仍然占用一定资源。...每个进程组有一个唯一的进程组ID。每个进程组都有一个组长进程,进程ID等于进程组ID的进程就是组长进程。 ? 会话 会话(session)是一个或多个进程组的集合。

    5.7K20

    【Linux】进程概念

    每个进程都会对应一个唯一的PCB,操作系统通过PCB来识别和管理进程的状态和资源。 首先我们知道一个程序在运行时都是要先被加载到内存中的,然后加载到内存中之后由CPU进行读取数据。...第一种方式:Ctrl+c 第二种方式:kill+进程标识符 这两种方式都可以结束进程。 我们已经知道了bash会创建一个子进程来执行我们的命令,那么我们该如何手动创建一个子进程呢?...通过上面的函数fork()可以手动创建一个子进程。 可以看见创建成功会给父进程返回子进程的pid,给子进程返回0,如果创建失败会返回-1。...因为这里创建了一个子进程,子进程和父进程共享同一份代码,但是数据是私有的,所以会产生这样的结果,我们来验证一下是不是。...可以看见只有子进程的++了,父进程并没有++,可以看见两个进程的数据是私有的,这里我们可以得出一个结论:两个进程之间是具有高度独立性的。 验证完这个之后,我们该如何创建多进程呢?

    39010

    Python实现守护进程

    博客:http://blog.tangyingkang.com/ ❈— Daemon场景 考虑如下场景:你编写了一个python服务程序,并且在命令行下启动,而你的命令行会话又被终端所控制...,python服务成了终端程序的一个子进程。...每个进程有自己的文件描述符表,因此相同的描述符可能指向同一个文件,也可能指向不同文件;来自不同进程的不同的描述符,当然也有可能指向同一个文件。...进程组 每个进程都属于一个进程组(PG,Process Group),进程组可以包含多个进程。...会话组 登陆终端时,就会创造一个会话,多个进程组可以包含在一个会话中。而创建会话的进程,就是会话组长。 已经是会话组长的进程,不可以再调用setsid()方法创建会话。

    2.3K80

    关于进程的实验(子进程和父进程相关的)

    1.第一个问题 编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。...的顺序输出的,可见这个操作系统对于这个进程的调度顺序并不是固定的,所以出现了这样的两次执行,但是结果不一样的情况; 2.第二个问题 修改已经编好的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象...源程序: 执行情况:while ((pid1 = fork()) == -1); 使用fork函数创建一个子进程。...由于lockf函数的存在,每个子进程内部的输出是有序的,但两个子进程和父进程之间的输出顺序是不确定的,取决于操作系统的进程调度。...例如,可能先输出父进程的内容,然后是第一个子进程的内容,最后是第二个子进程的内容;也可能是其他顺序 。但每个子进程自身的 5 次循环输出是连续且有序的。

    59910

    操作系统关于进程的实验报告(父进程和子进程)

    1.第一个问题编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。...的顺序输出的,可见这个操作系统对于这个进程的调度顺序并不是固定的,所以出现了这样的两次执行,但是结果不一样的情况;2.第二个问题修改已经编好的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象...源程序:执行情况:while ((pid1 = fork()) == -1); 使用fork函数创建一个子进程。...操作系统-ckf函数的存在,每个子进程内部的输出是有序的,但两个子进程和父进程之间的输出顺序是不确定的,取决于操作系统的进程调度。...例如,可能先输出父进程的内容,然后是第一个子进程的内容,最后是第二个子进程的内容;也可能是其他顺序 。但每个子进程自身的 5 次循环输出是连续且有序的。-操作系统--

    50800

    18 Python 基础: 重点知识点--进程和线程讲解

    Python既支持多进程,又支持多线程,我们会讨论如何编写这两种多任务程序。 小结 : 线程是最小的执行单元,而进程由至少一个线程组成。...如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。...子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。...我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据 [image.png] Pipes管道 管道实例化后会产生两个通道,分别交给两个进程 通过send和recv...多线程的并发在Python中就是一个美丽的梦。 ThreadLocal 在多线程环境下,每个线程都有自己的数据。

    97120

    《Linux系统编程之进程基础》【进程入门】

    ):告诉厨师每一步该做什么 一个菜谱(程序)可以同时被多个厨师使用,做出多份鱼香肉丝(多个进程) 每个厨师都有自己的工作台和原料,互不干扰。...方法一:通过getpid系统调用 getpid:是一个常用的系统调用(system call),主要功能是获取当前进程的进程ID(PID) 每个进程在 Linux 中都有一个唯一的非负整数标识符,...这可以从进程和当前工作目录(cwd,Current Working Directory)的角度来解释: 进程的当前工作目录(cwd) 在 Linux 等操作系统中,每个进程在运行时都有一个当前工作目录...(即 “父进程”)通过 fork() 或 clone() 等系统调用创建的 值得注意的是,一个父进程并非只能创建一个子进程 —— 它可以通过多次调用 fork() 生成多个子进程,这些子进程共享同一个父进程...进程创建逻辑 当你在终端中运行一个可执行程序(图中的code.exe )时: 是由当前的 bash 进程通过fork() 系统调用创建一个子进程 然后在子进程中通过exec() 族函数来执行你要运行的程序

    25910

    【Linux】进程深度剖析:从概念到 fork 函数应用

    )—— 每个进程对应一个 PCB 结构体,系统通过管理 PCB 来管理进程。...每个进程都是由另一个进程创建的,getppid能拿到创建当前进程的父进程的标识,常用于程序中确认自身的父进程是谁、判断父进程是否存活等场景。...【fork函数演示】 程序运行后能看到:fork之后的代码执行了两次;而且第二次执行结果里的 PPID(父进程 ID),恰好是第一次执行结果里的 PID(进程 ID)—— 这是不是正好能说明,当前程序中已经创建出一个子进程了...父子关系的唯一性约束一个父进程可以创建多个子进程,但一个子进程只有一个父进程: 子进程不需要 “区分父进程”(它的父进程是唯一的,可通过getppid()直接获取父进程 PID),所以返回0即可(0...是 “无特殊标识” 的约定值); 父进程需要 “管理多个子进程”(比如给子进程发信号、回收资源),必须通过子进程的 PID 来唯一标识每个子进程,因此返回子进程 PID。

    25410
    领券