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

linux 父进程与子进程

Linux 父进程与子进程基础概念

在Linux操作系统中,进程是正在执行的程序实例。每个进程都有一个唯一的进程标识符(PID)。父进程是创建子进程的进程,而子进程是由父进程通过系统调用如fork()创建的进程。

相关优势

  1. 并发执行:通过创建子进程,可以实现程序的并发执行,提高系统的整体性能。
  2. 资源隔离:子进程拥有独立的地址空间,一个进程的崩溃不会影响到其他进程。
  3. 任务分解:复杂的任务可以分解为多个子进程并行处理,提高效率。

类型

  • 守护进程:在后台运行,通常用于提供服务或监控系统状态。
  • 交互式进程:与用户直接交互,如文本编辑器或shell。

应用场景

  • 服务器程序:如Web服务器,通过创建多个子进程来处理客户端请求。
  • 批处理任务:将一个大任务分解为多个小任务,分配给不同的子进程执行。
  • 并行计算:科学计算中,利用多核CPU的优势,通过子进程进行并行计算。

遇到的问题及原因

问题1:僵尸进程

原因:子进程结束后,父进程没有及时调用wait()waitpid()获取子进程的退出状态,导致子进程成为僵尸进程。

解决方法

代码语言:txt
复制
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) { // 子进程
        // 执行任务
        exit(0);
    } else { // 父进程
        int status;
        wait(&status); // 等待子进程结束并回收资源
    }
    return 0;
}

问题2:孤儿进程

原因:父进程在子进程之前结束,子进程被init进程接管,成为孤儿进程。

解决方法: 通常不需要特别处理,因为init进程会负责清理孤儿进程的资源。

示例代码

以下是一个简单的父进程创建子进程的示例:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void child_process() {
    printf("Child process PID: %d\n", getpid());
    exit(0);
}

void parent_process() {
    int status;
    pid_t pid = fork();
    if (pid == 0) {
        child_process();
    } else if (pid > 0) {
        wait(&status); // 等待子进程结束
        printf("Parent process PID: %d, Child process exited with status %d\n", getpid(), WEXITSTATUS(status));
    } else {
        perror("fork");
        exit(EXIT_FAILURE);
    }
}

int main() {
    parent_process();
    return 0;
}

总结

父进程与子进程的关系在Linux系统中非常重要,合理利用可以提高程序的性能和可靠性。遇到僵尸进程和孤儿进程等问题时,可以通过适当的系统调用和程序设计来解决。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)

2.父进程与子进程 2.1介绍 在操作系统中,当一个进程(称为父进程)创建另一个新进程(称为子进程)时,父子进程之间建立了一种特殊的关系。...PID关系: 子进程的PID(进程标识符)是由父进程调用fork()或类似系统调用创建的。 子进程的PPID(父进程标识符)与创建它的父进程的PID相同。...在Unix/Linux系统中,可以使用 getpid() 系统调用来获取当前进程的PID,使用 getppid() 系统调用来获取当前进程的父进程的PID。...下面是对这两个返回值的解释: 给父进程返回子进程的 PID:在父进程中,fork 返回新创建子进程的进程 ID(PID),这个 PID 是子进程的标识符,父进程通过这个 PID 可以识别并操作子进程。...为了区分父进程和子进程,fork 在子进程中返回 0,表示这是子进程执行的代码路径。

1.8K10

探索父进程和子进程

父进程、子进程 这个父进程PID到底是什么?...先来认识一下fork函数: fork函数会以调用该函数的进程作为父进程创建一个子进程 创建成功时,会在父进程中返回子进程的PID,在子进程中返回0;如果失败,在父进程中返回-1,没有子进程创建。...一个父进程可以创建多个子进程,为了区分这些子进程,fork函数在创建子进程后,会给父进程返回子进程的pid。子进程只需调用getppid()函数即可找到父进程。...父进程和子进程也是两个进程,也具有独立性,父子进程不能访问同一份数据,数据在代码执行过程中可能会被修改。所以子进程要把父进程的数据单独拷贝一份,这个过程是由操作系统来完成的。...子进程可以把父进程的数据全被拷贝一份,但是大部分数据对于子进程来说可能都是没用的,这就造成了浪费,所以操作系统只是把父进程中数据层面的代码临时拷贝一份给子进程,即子进程创建后,会共享父进程的代码和数据,

15310
  • 父进程退出时如何确保子进程退出?

    前言 子进程退出的时候,父进程能够收到子进程退出的信号,便于管理,但是有时候又需要在父进程退出的时候,子进程也退出,该怎么办呢? 父进程退出时,子进程会如何?...一般情况下,父进程退出后,是不会通知子进程的,这个时候子进程会成为孤儿进程,最终被init进程收养。我们先来看一下这种情况。...另外还可以观察到,该进程也是其他系统进程的父进程。 如何确保父进程退出的同时,子进程也退出? 既然如此,如何确保父进程退出的同时,子进程也退出呢?...内容很多,主要意思为:设置一个信号,当父进程退出的时候,子进程将会收到该信号。 那么根据这个,我们完全可以在父进程退出时,也给子进程一个退出的信号。...总结 有些情况下,我们常常需要父子进程共存亡,子进程退出时,父进程可以通过wait捕捉子进程的退出状态,但是父进程退出时,子进程却难以得知。

    12.4K21

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

    假设是a进程创建了b进程,那么a进程就是b进程的父进程。...,假设我们利用一下该API,我们就能够将自己的进程的的父进程设置为随意进程(要提权绕过UAC的鸽子注意了),假设把木马进程的父进程设置为 杀软 的ID或者csrss.exe ,notepad.exe 等可信进程...假设你调试的程序检測父进程,直接用以上的办法启动它,当然父进程就是他检測同意的父进程喽, 这里启动时要注意的是设置CREATE_SUSPEND 就是创建挂起,然后在创建后使用ResumeThread恢复就能够顺利调试了...所以说进程的父进程不一定是进程的创建者,所以那一群依据父进程来看进程是否可信的杀软就呵呵了。 可是这里说下 360 这个绕只是,原因是啥哪? 记得我开篇时说过道高一尺,魔高一丈吗?...用这样的办法推断父进程才是真正的父进程。 这里參考文献是杂志《黑客防线》。我也不想学习了知识装起来。所以学习始终是学无止境!

    1.7K30

    Linux系统进程编程之回收子进程(三)

    wstatus用来返回子进程结束时的状态,父进程通过wait得到wstatus后就可以知道子进程的一些结束状态信息。...二、第二招:发送SIGCHILD信号: 1、我们还可以发送SIGCHILD信号来防止产生僵尸进程,当子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号,然后用上面信号处理函数中调用...第二个参数表示返回的状态;第一个表示选择性来指定返回的子进程的ID: ---pid == -1 等待任一子进程。于是在这一功能方面waitpid与wait等效。...---pid > 0 等待其进程I D与p i d相等的子进程。 ---pid == 0 等待其组I D等于调用进程的组I D的任一子进程。换句话说是与调用 者进程同在一个组的进程。...此时如果父进程执行waitpid时子进程已经先结束等待回收则waitpid直接回收成功,返回值是回收的子进程的PID; 如果父进程waitpid时子进程尚未结束则父进程立刻返回(非阻塞),但是返回值为

    3.4K20

    Linux进程——Linux进程与进程优先级

    所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态 僵尸状态就是Linux状态中的X死亡状态!...可父进程如果一直不读取,那子进程就一直处于Z状态!...开个玩笑,孤儿进程是父进程在子进程退出之前就先退出了,此时的子进程就称为“孤儿进程” 但是前面刚刚讲过一个进程在死亡时,PCB的死亡信息必须被读取后,才会释放PCB,但是如果父进程已经退出了,子进程的...子进程的父进程退出了,子进程要被领养,变成孤儿进程,而通过视频我们发现孤儿进程全部被1号进程统一领养了。...总结 本篇文章前部分紧贴上篇Linux进程,分析完了Linux下常见的进程状态,然后初步了解了Linux进程优先级,而进程优先级与前面内容相差较大,希望大家能够多花点时间理解!

    11110

    【Linux进程控制】五、wait()函数——子进程回收

    僵尸进程与孤儿进程 孤儿进程:父进程结束,子进程被init进程收养。 僵尸进程:子进程结束,父进程没有回收子进程的资源(PCB),这个资源必须要由父进程回收,否则就形成僵尸进程。...方法就是杀死父进程,父进程被杀死后,由init接管子进程并回收子进程资源。...父进程调用wait()函数可以回收子进程终止信息,wait()函数功能主要有三个:阻塞等待子进程退出;回收子进程残留资源;获取子进程退出状态(退出原因)。...回收一个组的子进程,使用时把组ID(一般是父进程ID)传给pid参数,就可以使用waitpid()回收这个进程组的所有子进程。...当waitpid()返回父进程中后,子进程才结束,但是waitpid()已经执行完了,所以并没有回收子进程,子进程因此变成僵尸进程。

    10310

    【linux】进程创建与进程终止

    01.进程创建 #include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后...,内核做: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 写时拷贝 02.进程终止 首先想清楚,终止是做什么...: 释放曾经的代码和数据所占据的空间 释放内核数据结构 进程退出场景: 代码运行完毕,结果正确 代码运行完毕,结果不正确(这两点可以通过进程退出码判断) 代码异常终止 上面的代码,进程11258为父进程...,父进程获取到的是最近一个子进程退出的退出码,前面我们提到,echo是内建命令,打印的都是bash内部的变量数据 父进程bash为什么要得到子进程的退出码呢?...这个退出码是一个整数,传递给父进程,用于表示子进程的终止状态。 常见惯例: 0(EXIT_SUCCESS):通常表示成功。程序执行完成且没有错误。

    10110

    父进程欺骗实践

    文章前言 监控父进程和子进程之间的关系是威胁检测团队检测恶意活动的常用技术,例如,如果powershell是子进程,而Microsoft Word是父进程,这是一种折中的行为,各种EDR可以很容易地检测到这种异常活动...,这时红队可以考虑使用父进程PID欺骗作为逃避方法,Windows API调用"CreateProcess"允许用户传入一个用于分配父PID的参数,它可以用于指定当前进程的父进程。...项目介绍 https://github.com/Al1ex/SelectMyParent image.png 进程欺骗 Step 1:选择父进程并确定其PID image.png Step 2:之后执行以下命令进行父进程欺骗...SelectMyParent.exe notepad 928 image.png Step 3:使用process Explor查看进程树,可以看到成功欺骗 image.png 参考链接 https

    1.4K20

    【Linux】进程间关系与守护进程

    id就是父进程的进程pid,其实也不难解释,因为需要先创建父进程才会创建子进程,而父子进程工作实际上就是在同一个进程组当中执行任务。...注意:   这个接口如果调用进程原来是进程组组长, 则会报错, 为了避免这种情况, 我们通常的使用方法是先调用 fork 创建子进程, 父进程终止, 子进程继续执行, 因为子进程会继承父进程的进程组...不同的程序员对创建守护进程的方式不同,这里我们用上面提到的 setsid() 来创建一个新的会话,这样就可以形成一个守护进程了,但是调用该接口的不能是进程组的组长,所以我们可以通过fork创建子进程,并将父进程退出...而父进程退出之后子进程就变成了孤儿进程,所以守护进程是孤儿进程的一种特殊情况。   ...如果我们直接调用setsid()是行不通的,必须得首先创建子进程,并且退出父进程,这样很费力,所以Linux给我们提供了一个一劳永逸的接口,不需要你创建子进程,因为其函数内部就已经做了处理 Daemon

    12510

    【Linux】:进程间关系 与 守护进程

    :用户直接与之交互的任务或程序。...每一个会话也有一个会话 ID(SID) 比如:上面中进程组中的 SID 都相同,并且与父进程 Id 一样,这个 SID 究竟是什么呢?...创建子进程, 父进程终止, 子进程继续执行, 因为子进程会继承父进程的进程组 ID, 而进程 ID 则是新分配的, 就不会出现错误的情况 5....由 bash 创建一个 子进程 或者 进程组,如果进程组中只有一个进程,那么就是单进程的进程组 然后如果不想受登录退出的影响,那么就要把它独立形成一个新的会话,那么此进程与bash 的关系 从 包含 -...守护进程其实就是一个孤儿进程,它脱离了父进程和终端,由系统的 init 进程(PID 1) 接管 由于守护进程没有父进程,它不会受到用户注销或终端关闭的影响,可以在后台长期运行 6.2 如何将服务守护进程化

    5410

    【Linux】进程间关系与守护进程

    --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组 2 会话 3 控制终端 4 作业控制 5 守护进程 1 进程组 之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID...每当我们通过Xshell客户端正确的登录到Linux系统后,系统会给我们创建一个终端文件,并且配套一个bash进程(进程组的形式)!我们写的命令写入到终端文件,然后通过bash进程执行在返回结果。...我们在下边详细介绍一下: 一个会话可以有一个控制终端, 通常会话首进程打开一个终端(终端设备或伪终端设备) 后, 该终端就成为该会话的控制终端。 建立与控制终端连接的会话首进程被称为控制进程。...4 作业控制 作业在Linux环境中,是指为完成用户指定任务而启动的一组进程。一个作业可能仅包含单一进程,也可能由多个相互协作的进程构成,这些进程通常通过管道机制进行通信。...设置让自己成为一个新的会话, 后面的代码其实是子进程在走 setsid(); // 4.

    12810

    Nodejs子进程

    默认情况下, stdin、 stdout 和 stderr 的管道会在父 Node.js 进程和衍生的子进程之间建立,这些管道的容量是有限的。...child_process.fork(): 衍生新的 Node.js 进程,并调用指定的模块,该模块已建立了 IPC 通信通道,可以在父进程与子进程之间发送消息。...process.pid} is running`) for( let i = 0; i < numsCPUS.length; i++) { cluster.fork() // fork出来的子进程拥有和父进程一致的...master进程创建一个socket,并绑定监听到该目标端口,通过与子进程之间建立IPC通道,调用子进程的send方法,将socket(链接句柄)传递给子进程,大致实现如下。...模式的区别 浏览器进程与线程梳理 cluster子进程重启方案 cluster 模块的实现原理

    1.3K20
    领券