在 Linux 中,每个进程都属于一个或多个组,getgid() 函数返回调用进程的有效组 ID。...1.4通过 /proc 系统文件夹看进程 在Linux系统中,/proc文件系统提供了关于运行中进程的详细信息。你可以通过查看/proc文件系统中的特定目录和文件来获取有关进程的信息。...2.父进程与子进程 2.1介绍 在操作系统中,当一个进程(称为父进程)创建另一个新进程(称为子进程)时,父子进程之间建立了一种特殊的关系。...在Unix/Linux系统中,可以使用 getpid() 系统调用来获取当前进程的PID,使用 getppid() 系统调用来获取当前进程的父进程的PID。...3.3Linux中状态初步认识 一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)进程的状态通常由几个不同的状态标识符表示。
: 通过getpid()得到的PID和ps指令获取的进程PID是一致的,都是5258 一个进程属性中,除了有自己的进程PID还有父进程PID,ps指令中查询到的PPID是当前进程的父进程的PID,可以是用函数...先来认识一下fork函数: fork函数会以调用该函数的进程作为父进程创建一个子进程 创建成功时,会在父进程中返回子进程的PID,在子进程中返回0;如果失败,在父进程中返回-1,没有子进程创建。...一个父进程可以创建多个子进程,为了区分这些子进程,fork函数在创建子进程后,会给父进程返回子进程的pid。子进程只需调用getppid()函数即可找到父进程。...调用fork函数创建子进程,实际上是在操作系统中多了一个进程,一样的,它也需要先创建一个属于自己的PCB对象,子进程的PCB对象大部分都是以父进程的PCB对象为模板创建的,即直接从父进程的PCB对象那拷贝过来的...fork有两个返回值本质上是因为父子进程共用一份代码导致的,父进程会执行return返回一个值,子进程也会执行return返回一个值。 一个变量为什么同时会有两个返回值?
Linux中,父进程和子进程是并行运行的,先运行哪个是不确定的,在小红帽系统(Red Hat)中,先运行的是子进程,在ubuntu系统中,父进程是先运行的。...其实谁先运行不重要了,一般在编程中,把父进程当做守护进程使用,用一个waitpid(pid,&status,0) != pid 等待子进程的结束,父进程一直阻塞在这个函数中。...\n"); } else { // 父进程 printf("Parent process!...\n"); } else { // 父进程 printf("Parent process!...\n", pid_wait); } return 0; } 结果(Ubuntu中):父进程等待了子进程结束 ? 如果喜欢我的文章,欢迎关注、点赞和转发,下面可以留言~~~
这一篇大致说一下进程的创建,有兴趣的可以参考之前的一些文章或者直接上代码https://github.com/theanarkh/read-linux-0.11。 系统有一个GDT表。...该表保存了系统和所有进程的tss和ldt描述符信息。tss就是我们平时说的进程上下文。每个进程有一个ldt数组,里面保存了代码段和数据段的描述符信息。 首先,从一个进程的诞生说起。...我们知道,通过fork可以创建一个进程。下面我们来看一下fork的过程都做了什么事情。先通过find_empty_process获取一个可用的进程id和pcb。pid是进程id。...task[i]) return i; return -EAGAIN; } 接着调用copy_process复制父进程的信息。...// 把父进程的页目录项和页表复制到子进程,old_data_base,new_data_base是线性地址,父子进程共享物理页面,即copy on write if (copy_page_tables
白发人送黑发人 一个普遍的常识是,在Linux里面总是“白发人送黑发人”,子进程死亡,父进程透过wait()等待子进程死亡,并清理子进程僵尸,当然父进程也可以因此而获得子进程的死亡原因。...则父进程探测到子进程死亡后,可打印它的退出状态: $ ....事出必有因 那么,父进程为什么必须知道子进程的死亡呢?父进程为什么一定要苦苦地知道子进程的死亡原因?...前一个问题很好回答,如果我们用init进程启动了一个httpd的服务供客户访问我们的网站,然后httpd进程半夜挂了。...所以,这个过程应该由Linux的某种机制自动完成,比如如果init知道了httpd死亡的话,它可以内在地自动重新启动一个httpd进程。
文章前言 监控父进程和子进程之间的关系是威胁检测团队检测恶意活动的常用技术,例如,如果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
前言 子进程退出的时候,父进程能够收到子进程退出的信号,便于管理,但是有时候又需要在父进程退出的时候,子进程也退出,该怎么办呢? 父进程退出时,子进程会如何?...,而是被一个名为/sbin/upstart的进程所收养。...第一个参数中,有一个选项,叫做PR_GET_PDEATHSIG: PR_SET_PDEATHSIG (since Linux 2.1.57) Set the...内容很多,主要意思为:设置一个信号,当父进程退出的时候,子进程将会收到该信号。 那么根据这个,我们完全可以在父进程退出时,也给子进程一个退出的信号。...练习 尝试将上面的代码在非图形界面的linux操作系统中运行,看看最终被收养的是否为init进程。 交流 虽然本文方法可行,但并不适用于所有操作系统,你有什么更好的办法解决上面的问题?
今天想到一个问题:如果我在代码里面,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这样的字节设备的特性有关)
表面上看。在windows中。 假设是a进程创建了b进程,那么a进程就是b进程的父进程。...反之,假设是b创建了a,那么b进程就是a的父进程,这是在windows出现以来一直是程序员们都证实的,可是在在win Vista后面有了一个新安全消息机制。...IceSworld,Process Explorer等) 查看时,会发现提权的进程的父进程是创建它的进程,这是由于AIS利用了CreateProcessAsUser() API中的一个新的功能,这里的新功能就是将提权进程的父进程设置成创建该进程的进程...,那么对于根据父进程可疑(进程链)来查杀的杀软就轻易绕过了,这里顺便提示下还有一个绕过反调试的小技巧,假设你发现一个该死的小程序检查父进程是不是explorer.exe来推断是否是合法环境。...而且提供一个(有足够权限的)进程句柄。
1.进程创建 1.1 fork函数 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。...fork代码后,内核做: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 当一个进程调用fork之后,就有两个二进制代码相同的进程...具体见下图: 1.3 fork常规用法 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求 一个进程要执行一个不同的程序。...所以要写一个shell,需要循环以下过程: 获取命令行 解析命令行 建立一个子进程(fork) 替换子进程(execvp) 父进程等待子进程退出(wait) 根据这些思路,和我们前面的学的技术,就可以自己来实现一个...Linux鼓励将这种应用于程序之内的模式扩展到程序之间。如下图 一个C程序可以fork/exec另一个程序,并传给它一些参数。这个被调用的程序执行一定的操作,然后通过exit(n)来返回值。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态 僵尸状态就是Linux状态中的X死亡状态!...1.2 为什么会存在僵尸状态 Linux进程中,当一个进程死亡时不会立刻销毁,而是要等待我们读取死亡信息后才会死亡!...综上所述:当一个进程退出了,但是退出信息还没被父进程读取,此时这个退出进程的PCB结构不被释放,此时这个退出进程就处于僵尸状态(Z) 1.3 观察僵尸状态 让我们来直观看了解一下僵尸状态 1 #include...开个玩笑,孤儿进程是父进程在子进程退出之前就先退出了,此时的子进程就称为“孤儿进程” 但是前面刚刚讲过一个进程在死亡时,PCB的死亡信息必须被读取后,才会释放PCB,但是如果父进程已经退出了,子进程的...容易导致优先级较低的进程,长时间得不到CPU资源 --进程饥饿 因此:每一个进程不是占有CPU就一直运行,每隔一段时间,自动被从CPU上剥离下来 Linux 内核支持进程之间进行cpu资源抢占的,基于时间片的轮转式抢占式内核
前言:在进程学习这一块,我们主要学习的就是PCB这个进程控制块,而PBC就是用来描述进程的结构体,而进程状态就是PCB结构体中的一个变量。...本篇主要内容: 操作系统中的进程状态 Linux下的进程状态 在开始之前,我们先来简单了解以下进程状态 进程的本质就是PCB中的一个变量!!! 所谓状态变化,本质就是修改整形变量!!!...挂起状态 假设: 一个进程当前被阻塞了,那么这个进程在它所等待的资源没有就绪的时候,该进程是无法被调度的。如果此时恰好OS内的内存资源已经严重不足了,那么操作系统该怎么办?...此时,恰好系统内的内存资源已经严重不足了,系统压力太大,Linux在是在没办法时候,会通过杀掉进程,节省资源的,来不及进程反应直接被系统 “干掉” 。...总结 在了解Linux中进程的分类时,我们通常是先了解操作系统的进程,因为二者有一定的联系,了解操作系统能更好理解进程在操作系统中的运行关系。进程状态在进程中也极为重要,希望大家能理解透彻!
前言:在了解完冯诺依曼体系结构和操作系统之后,我们进入了Linux的下一篇章Linux进程,但在学习Linux进程之前,一定要阅读理解上一篇内容,理解“先描述,再组织”才能更好的理解进程的含义。...Linux进程学习基础 本篇主要内容: 进程的概念 通过系统调用获取进程标示符 1....用系统调用函数查看PID 2.4 父进程和子进程 在使用ps指令查看进程信息时,除了PID我们可以看见左边还有一个PPID,当我们不断地启动结束进程时,PID每一次的数据都不一样,但是PPID...而这PPID就是父进程 我们依然可以用函数来查看父进程: 函数:getppid 因此我们可以知道这两个函数: 当我们不断地启动结束进程时,PID每一次的数据都不一样,但是PPID却不会改变...,让我们来查看一下父进程信息 如果我们直接杀死父进程bash,那么我们的shell会直接挂掉 3.
SIGHUP信号,因为子进程会继承父进程的sessionid,所以if可能会多次成立 static void kill_session(void) { struct task_struct **...if (task[i] && task[i]->father == current->pid) { // 子进程的新父进程是进程id为1的进程...= -1) { // 不等于-1说明是等待某一个组的,但不是当前进程的组,组id是-pid的组,不是该组则跳过 if ((*p)->pgrp !...linux通过下面函数建立一个会话。...->pgrp = current->pid; // 重置终端,会话领头进程第一个打开终端的时候赋值,一个会话对应一个终端 current->tty = -1; return current
前言:在讲完环境变量后,相信大家对Linux有更进一步的认识,而Linux进程概念到这也快接近尾声了,现在我们了解Linux进程中的地址空间!...因为我们之前讲过子进程按照父进程为模版,父子并没有对变量进行进行任何修改 但是在达到一定条件之后,父子进程,输出地址是一致的,但是变量内容不一样! 但是相同的地址为什么会有不同的值?...进程地址空间 我们现在来深入的了解一下为什么相同的的地址为什么会有不同的值? 首先引入一个概念:每一个进程运行之后,都会有一个进程地址空间的存在,在系统层面都要有自己的页表映射结构!...因此:当一个进程先修改后,它就不再指向原来那块物理空间,而是拥有一个新的物理空间!而页表左边的虚拟空间没有发生改变,所以相同的的地址为什么会有不同的值,是因为映射的物理空间不同! 3....结束进程地址空间,我们的Linux进程概念到这里也结束了,后面我将带大家走进进程控制。 谢谢大家支持本篇到这里就结束了
笔记:根据一个进程的名字或启动此进程的命令(连续的一部分即可)杀死进程 一、使用单条命令 ps -ef | grep 进程名/启动进程的命令 | grep -v grep | awk ‘{print $2...}’ | xargs kill -9 执行结果: [1]- 已杀死 sleep 200 [2]+ 已杀死 sleep 200 二、编写脚本 linux.../bin/bash # 脚本名:kill_process.sh # 脚本功能:强制杀死进程 方式kill -9 # 1通过ps查询进程的id # 2使用kill -9 强制终止进程...请使用此方式运行:/bin/bash kill_process.sh 进程名” exit 1 fi # 获取要被杀死的进程名 pName=$1 <<! ...————————————————————— # 根据进程名查询包含进程名的进程 并排除grep查询进程和此脚本进程 ps -ef | grep “$pName” | grep -v grep | grep
,即把手机揣进兜里,然后 专心执行走路这个 进程 进程状态 进程 有各种运行状态,方便OS进行管理,在 Windows 中,进程 状态是这样的 而在我们 Linux 中,新建、就绪、运行都可以看作...运行 R 这一个状态,所以比较清晰 而我们今天要学习的正是 Linux 中的 进程 状态 进程是何种状态,取决于此进程的PCB在哪里排队 ️运行 R 首先来看看第一种状态 R 以我们以往的认知来说...进程 在指定行暂停运行,此时 进程 处于 追踪暂停状态 t ️死亡 X 当进程被终止后,就处于 死亡 X 状态 死亡状态是无法在任务列表中观察到的,死亡 X 状态只是一个返回状态 ️僵尸 Z 与死亡状态相对应的还有一个...僵尸 T 状态 通俗来说,僵尸状态 是给 父进程 准备的 当 子进程 被终止后,会先维持一个 僵尸 状态,方便 父进程 来读取到 子进程 的退出结果,然后再将 子进程 回收 单纯的在 bash 环境下终止...父进程,此时 子进程 会被OS领养 子进程 的 父进程 变为 1号进程 子进程 就变成了一个 孤儿进程 发出指令终止 父进程 假设 子进程 不被 1号进程 领养 子进程 退出时就会无人回收
一、普通进程 在 Linux 中普通进程依赖称之为 nice 值 的东东来进行进程的优先级描述。nice 值的范围是 [-20, 19]。...越高优先级的 普通进程 有着越高的执行时间(注意,这里值的越高的执行时间,指的是在一小段观察时间内,每个可执行的进程都执行一遍的情况,这里的描述可能产生一些歧义,稍安勿躁,接着看)。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...既然所有进程的vruntime增长速度宏观上看应该是同时推进的,那么就可以用vruntime来选择运行的进程,vruntime值较小就说明它以前占用cpu的时间较短,受到了“不公平”对待,因此下一个运行进程就是它...Linux 调度时机 ---- 一、进程切换 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。
2.杀死进程 使用kill命令结束进程:kill xxx 常用:kill -9 324 Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:...(1)强行中止(经常使用杀掉)一个进程标识号为324的进程: #kill -9 324 (2)解除Linux系统的死锁 在Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。...(4)killall命令 Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如: # killall -HUP inetd *杀死进程最安全的方法是单纯使用kill...然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。...*TERM信号 给父进程发送一个TERM信号,试图杀死它和它的子进程。 # kill -TERM PPID *killall命令 killall命令杀死同一进程组内的所有进程。
"字符串地址:%p\n", ps); //%p 专门用来打印地址信息 return 0; } 利用前面学习的 fork 函数创建子进程,使得子进程和父进程共同使用一个变量 #include <stdio.h...d 共享值地址:%p\n", getpid(), getppid(), val, &val); exit(0); } waitpid(id, 0, 0); printf("我是父进程...光有 虚拟地址空间 是不够的,还需要一套完整的 ‘‘翻译’’ 机制进行程序寻址,如 Linux 中的 页表 + MMU ️页表+MMU 页表 本质上就是一张表,操作系统 会为每个 进程 分配一个 页表...️写时拷贝 Linux 中存在一个很有意思的机制:写时拷贝 这是一种 赌bo 行为,OS 此时就赌你不会对数据进行修改,这样就可以 使多个 进程 在访问同一个数据时,指向同一块空间,当发生改写行为时...Linux进程学习【进程地址】的全部内容了,我们从一个有趣的小问题切入,见识到了 虚拟地址空间 与 物理地址空间 的奇妙关系,在种种机制的加持之下,OS 对进程的管理变得更加得心应手,系统也因此得以高效运行
领取专属 10元无门槛券
手把手带您无忧上云