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

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

PID关系: 子进程的PID(进程标识符)是由父进程调用fork()或类似系统调用创建的。 子进程的PPID(父进程标识符)与创建它的父进程的PID相同。...资源继承: 子进程继承了父进程的大部分属性和资源,包括内存映像、文件描述符、信号处理器等。 子进程在创建时拥有父进程的副本,但在其生命周期中可以独立修改这些副本。...在Unix/Linux系统中,可以使用 getpid() 系统调用来获取当前进程的PID,使用 getppid() 系统调用来获取当前进程的父进程的PID。...下面是对这两个返回值的解释: 给父进程返回子进程的 PID:在父进程中,fork 返回新创建子进程的进程 ID(PID),这个 PID 是子进程的标识符,父进程通过这个 PID 可以识别并操作子进程。...这是因为在 Unix-like 系统中,子进程是通过复制父进程的地址空间而创建的,因此子进程从父进程继承了大部分的内存布局和数据。

4.5K10

探索父进程和子进程

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

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

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

    让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。...下面的是源代码: 下面的是执行的结果:可以发现也是会出现不同的这个结果的,一次是bac也就是子进程1,父进程,子进程2的顺序,还有一个就是父进程,子进程1,子进程2的顺序; 3.第三个问题 如果在程序中使用系统调用...fork函数调用一次,返回两次:在父进程中返回子进程的 ID(大于 0 的值),在子进程中返回 0,如果创建失败则返回 - 1。这里通过while循环确保fork成功执行。...由于lockf函数的存在,每个子进程内部的输出是有序的,但两个子进程和父进程之间的输出顺序是不确定的,取决于操作系统的进程调度。...例如,可能先输出父进程的内容,然后是第一个子进程的内容,最后是第二个子进程的内容;也可能是其他顺序 。但每个子进程自身的 5 次循环输出是连续且有序的。

    57110

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

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

    13.7K21

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

    假设是a进程创建了b进程,那么a进程就是b进程的父进程。...IceSworld,Process Explorer等) 查看时,会发现提权的进程的父进程是创建它的进程,这是由于AIS利用了CreateProcessAsUser() API中的一个新的功能,这里的新功能就是将提权进程的父进程设置成创建该进程的进程...,假设我们利用一下该API,我们就能够将自己的进程的的父进程设置为随意进程(要提权绕过UAC的鸽子注意了),假设把木马进程的父进程设置为 杀软 的ID或者csrss.exe ,notepad.exe 等可信进程...假设你调试的程序检測父进程,直接用以上的办法启动它,当然父进程就是他检測同意的父进程喽, 这里启动时要注意的是设置CREATE_SUSPEND 就是创建挂起,然后在创建后使用ResumeThread恢复就能够顺利调试了...所以说进程的父进程不一定是进程的创建者,所以那一群依据父进程来看进程是否可信的杀软就呵呵了。 可是这里说下 360 这个绕只是,原因是啥哪? 记得我开篇时说过道高一尺,魔高一丈吗?

    2.1K30

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

    让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。...下面的是源代码:下面的是执行的结果:可以发现也是会出现不同的这个结果的,一次是bac也就是子进程1,父进程,子进程2的顺序,还有一个就是父进程,子进程1,子进程2的顺序;3.第三个问题如果在程序中使用系统调用...fork函数调用一次,返回两次:在父进程中返回子进程的 ID(大于 0 的值),在子进程中返回 0,如果创建失败则返回 - 1。这里通过while循环确保fork成功执行。...操作系统-ckf函数的存在,每个子进程内部的输出是有序的,但两个子进程和父进程之间的输出顺序是不确定的,取决于操作系统的进程调度。...例如,可能先输出父进程的内容,然后是第一个子进程的内容,最后是第二个子进程的内容;也可能是其他顺序 。但每个子进程自身的 5 次循环输出是连续且有序的。-操作系统--

    45700

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

    那么说了这么多,我们该怎么样来回收Linux系统的僵尸进程呢?...wstatus用来返回子进程结束时的状态,父进程通过wait得到wstatus后就可以知道子进程的一些结束状态信息。...返回值是子进程的ID,当前父进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了: wait(): on success...二、第二招:发送SIGCHILD信号: 1、我们还可以发送SIGCHILD信号来防止产生僵尸进程,当子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号,然后用上面信号处理函数中调用...此时如果父进程执行waitpid时子进程已经先结束等待回收则waitpid直接回收成功,返回值是回收的子进程的PID; 如果父进程waitpid时子进程尚未结束则父进程立刻返回(非阻塞),但是返回值为

    4K20

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

    僵尸进程与孤儿进程 孤儿进程:父进程结束,子进程被init进程收养。 僵尸进程:子进程结束,父进程没有回收子进程的资源(PCB),这个资源必须要由父进程回收,否则就形成僵尸进程。...方法就是杀死父进程,父进程被杀死后,由init接管子进程并回收子进程资源。...()); sleep(2); /*子进程睡眠3秒,那么父进程中的wait函数会阻塞3秒,一直等到子进程退出*/ while(1) {...回收一个组的子进程,使用时把组ID(一般是父进程ID)传给pid参数,就可以使用waitpid()回收这个进程组的所有子进程。...,这是因为在waitpid()函数中使用了选项参数WNOHANG,而子进程中有一个睡眠函数,子进程睡眠的时候,父进程中waitpid()语句没有等到子进程结束就执行了,由于WNOHANG选项参数的存在,

    66110

    父进程欺骗实践

    文章前言 监控父进程和子进程之间的关系是威胁检测团队检测恶意活动的常用技术,例如,如果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.8K20

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

    白发人送黑发人 一个普遍的常识是,在Linux里面总是“白发人送黑发人”,子进程死亡,父进程透过wait()等待子进程死亡,并清理子进程僵尸,当然父进程也可以因此而获得子进程的死亡原因。...上述代码中,子进程在第18行通过pause()等待信号,父进程在代码的第22行通过waitpid()等待子进程的结束。其中的参数status是一个输出参数,可以获得子进程死亡的原因。...则父进程探测到子进程死亡后,可打印它的退出状态: $ ....这一点从内核的源代码里面也可以看出来: ? 在wait_task_zombie()中,父进程会透过子进程的僵尸分析获得子进程的exit_code组合,并进一步拼装status。...事出必有因 那么,父进程为什么必须知道子进程的死亡呢?父进程为什么一定要苦苦地知道子进程的死亡原因?

    2.4K20

    如何在父进程中读取子(外部)进程的标准输出和标准错误输出结果

    它是我们启动子进程时,控制子进程启动方式的参数。...SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; // 新创建的进程继承管道读写句柄...我们之后将hWrite交给我们创建的子进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取子进程写入管道的内容。...此处要注意的就是将SECURITY_ATTRIBUTES对象的bInheritHandle设置为TRUE,这样我们获取的两个操作管道的句柄就有可继承属性。...也就是说,我们设置的这些句柄要有可继承性。这就解释了我们之前为什么在创建管道时要将句柄可继承性设置为TRUE的原因。         一般来说,我们要代理的程序已经输入好信息了。

    6.2K10

    linux~~监控子进程&创建新的线程

    wait函数的返回值; wait等待任意的一个子进程终止退出,如果子进程都不结束,wait将会一直处于一个阻塞的状态,有一个子进程终止,这个函数就会有对应的终止进程的返回值; 所有子进程全部终止结束,这个时候的...wait函数的返回值就是-1; 2.wait函数演示 创建3个子进程,分别是5,10,15s之后结束,查看这个父进程等待的情况以及wait函数的返回值的情况; 下面将会通过代码实现这个过程:我们创建一个已知的进程...,我们可以称之为父进程,这个父进程创建了三个子进程,分别给这三个子进程创建休眠的时间,5s,10s,15s等等; 这个时候的main函数里面设置了相关的参数,其中这个里面的第一个参数就是argc,这个参数的意义就是我们的...,因为这个终端输出的是字符10,5,15,因此我们设置的休眠时间的时候需要使用这个atoi函数把这个字符转换为int类型的数据; 因为是3个子进程,但是这个下标是0,1,2,3,其中这个里面的0表示的就是我们的父进程...,1,2,3分别表示的就是3个子进程,因此我们的这个for循环是从这个1开始循环的,当返回值是-1的时候,就说明这三个子进程全部结束了; 其中这个里面的while循环会一直进行,返回值-1这个子进程全部结束

    85600

    C语言Linux系统编程-等待终止的子进程(僵死进程)

    1.等待终止的子进程(僵死进程): 如果一个子进程在父进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程 当父进程获取了子进程的信息后,子进程才会消失。...pid_t wait(int *status); 父进程调用这个方法会被阻塞住,如果子进程终止的时候,此方法会调用并且返回终止子进程的pid #include #include 的子进程pid=%d\n",pid,ppid,ret); int status; int sonPid...,pid=22315 , ppid=12479 ,我新建的子进程pid=22316 我是子进程,pid=22316 , ppid=22315 我的子进程,pid=22316,终止了 2.如果父进程在子进程之前终止了...,那么系统会把子进程设置给init进程(pid为1),init进程会周期性的等待所有的子进程,确保没有长时间的僵死进程

    4.2K20

    Nodejs子进程

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

    1.8K20

    Fork进程后,是否与父进程共享stdio?

    今天想到一个问题:如果我在代码里面,fork当前进程,然后两个进程都执行scanf(),那会发生什么?键盘输入的数据是定向到哪个进程呢?...scanf("%c\n", &c); printf("parent process: %c\n", c); } } } 根据上面这串代码,父进程和子进程都会调用...scanf,并打印自己读取到的数据。...process: 4 child process: 5 parent process: 5 parent process: 6 child process: 6 child process: 可以看到,父进程和子进程都读取了键盘的数据...具体是哪一个进程获取到数据,则与进程调度有关。这提醒了我一点:多个进程同时读取同一个stdin的话,会造成获取到的数据不完整的问题。(这与stdin默认为tty这样的字节设备的特性有关)

    44220

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

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

    3.6K40
    领券