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

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

最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包中的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。...这个API的参数非常多,我想我们工程中对CreateProcess的调用可能就关注于程序路径(lpApplicationName),或者命令行(lpCommandLine)。...它是我们启动子进程时,控制子进程启动方式的参数。...我们之后将hWrite交给我们创建的子进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取子进程写入管道的内容。...也就是说,我们设置的这些句柄要有可继承性。这就解释了我们之前为什么在创建管道时要将句柄可继承性设置为TRUE的原因。         一般来说,我们要代理的程序已经输入好信息了。

6.4K10

【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 procpidmaps 中查看进程堆内存详情 )

文章目录 一、sbrk 内存分配系统调用代码示例 二、在 /proc/pid/maps 中查看进程堆内存详情 本篇博客调用 sbrk 系统调用函数 , 申请并修改 堆内存 , 并在 /proc/pid/...maps 中查看该进程的 堆内存 ; 一、sbrk 内存分配系统调用代码示例 ---- sbrk 系统调用函数 , 作用是 修改程序 BSS 段大小 ; 函数原型如下 : #include 进程一直存活 ; // 此处死循环阻塞, 方便查看 /proc/pid/maps 中的信息 // 进程退出后 , 进程相关内存信息也会同时销毁 while (1); 完整代码示例...printf("p_new : %p\n", p_new); // 此处死循环阻塞, 方便查看 /proc/pid/maps 中的信息 // 进程退出后 , 进程相关内存信息也会同时销毁..., 在第二次申请内存时 , 指针始终没有改变 , 一直都是 0x203e000 地址 ; 如果使用新的指针 p_new 接收 sbrk 系统调用返回的堆内存指针 , 则分配的是新的地址 ; 二、在 /

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

    Data Execution Prevention (DEP) 在 Windows 中的进程内存执行保护机制

    DEP 在 Windows 操作系统中的重要角色和实际应用。...DEP 的目标DEP 的主要目的是在进程的默认堆、栈以及其他内存池上施加执行保护,以减少缓冲区溢出或其他内存漏洞被利用的风险 。...内存页标记当进程尝试在不可执行页上执行代码时,CPU 检测到 NX/XD 位并触发 STATUS_ACCESS_VIOLATION 异常 citeturn1view0。...DEP 的实现模式硬件执行预防硬件 DEP(又称 NX/XD)在支持该功能的处理器上自动启用,借助 PAE(Physical Address Extension)在 32 位系统中强制实施,或在 64...编程实践为了演示如何在应用内部分配可执行内存并再设为不可写,下面给出一个简化的 C 语言示例。请在支持 Windows API 的编译环境中执行。

    1.1K10

    【嵌入式Linux应用开发基础】vfork()函数

    返回值 在父进程中,vfork() 返回子进程的进程 ID(PID),这是一个大于 0 的整数。 在子进程中,vfork() 返回 0。...执行顺序:父进程会阻塞,直到子进程调用 exec() 或 _exit() 终止。 高效性:在资源受限的嵌入式系统中,vfork() 避免了复制页表等开销,比传统的 fork() 更轻量。...典型示例: 多线程网络服务中执行外部命令:嵌入式 HTTP 服务器(多线程架构)收到请求后,需安全执行 curl 下载固件: // 避免 fork() 后子进程复制父进程锁状态 if (vfork()...避免在多线程程序中使用 vfork() 风险:若父进程是多线程的,vfork() 的子进程可能复制部分线程状态,导致死锁或资源泄漏。...未使用 _exit() 终止子进程 父进程I/O混乱 强制 _exit() 忽略子进程回收 僵尸进程 父进程调用 wait() 在多线程程序中使用 死锁、资源泄漏 使用 fork() 或 posix_spawn

    9010

    通过在非特权进程中查找泄漏的句柄来寻找特权升级和 UAC 绕过

    最近我一直在寻找某种类型的漏洞,它可能导致权限升级或 UAC 绕过。既然我认为它还没有被彻底解释清楚,更不用说自动化了,我们为什么不开始这个新的冒险呢?...,如果设置为TRUE,将使句柄可继承,这意味着调用进程在子进程生成时将返回的句柄复制到子进程(以防我们的程序调用类似的函数CreateProcess) dwProcessId是一个DWORD用于指定我们要打开哪个进程...),并且我希望该程序的子进程继承返回的句柄(TRUE)。...,我们只是一遍又一遍地调用函数,直到分配的内存空间大到足以容纳所有数据。...我们将调用它mHandleId。 完成后,我们使用CreateToolhelp32Snapshot和指定我们只想要进程(通过TH32CS_SNAPPROCESS参数)获取有关进程的系统状态快照。

    1.5K40

    【Linux系统编程】—— 进程与进程管理在Linux中的基本概念

    具体来说: 父进程(Parent Process): fork() 在父进程中返回子进程的 PID(进程标识符),也就是新创建的子进程的进程ID。...父进程返回值: 在父进程中,fork() 返回的是 子进程的 PID(进程标识符),即刚刚创建的子进程的进程ID。...通过将 fork() 的返回值区分为父进程返回子进程的 PID 和子进程返回0,可以让父进程与子进程在代码中做不同的事情。例如: 父进程可以继续执行它的任务或等待子进程结束。...内存泄漏 尽管僵尸进程不再执行,但其在内核中占用的内存(如 task_struct)并没有被回收,直到其父进程通过 wait() 系统调用清理它。...如何避免僵尸进程: 父进程回收子进程状态:父进程在子进程退出后,应该及时调用 wait() 或 waitpid() 系统调用来回收子进程的退出状态,避免子进程成为僵尸进程。

    47710

    【Linux】开始掌握进程控制吧!

    2 进程创建 2.1 fork函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...注意:进程调用fork,当控制转移到内核中的fork代码后,内核做以下工作: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程(进程:内核的相关数据管理的数据结构(task_struct...2.2 fork函数返回值 子进程返回0 父进程返回的是子进程的pid 那为什么父进程返回子进程PID ,给子进程返回0呢???...关闭所有打开的流,所有的缓存数据均被写入 调用_exit 3 进程等待 3.1 进程等待必要性 子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息 也就是说,任何进程在退出时都要被父进程进行等待,不然子进程处于僵尸进程就会造成内存泄漏!!!

    33510

    OOM Killer的一点分析

    我们的svr的worker进程都有一个用于守护的父进程,在worker子进程挂掉或者运行正常退出之后,会由父进程重新拉起 考虑到线上的内存泄漏都是很缓慢不容易发现的,因此我们希望能够让父进程在OOM的情况下不被...os干掉,而是让os kill掉泄漏的子进程,然后由父进程重新拉起子进程,从而让模块可以继续服务。...对于另一个问题,为什么epoll进程没有被kill掉,而总是worker进程被kill掉,从上面的分析也可以得到大概的解释,对于worker子进程来说,被kill掉是因为本身有内存泄漏,确实占用了大量内存导致...,而对于worker的守护进程来说,则是由于其fork了worker子进程,导致在计算point的时候,子进程的一半内存大小被计算到守护进程的point中,使得守护进程在本身没有泄漏和占用大量内存的情况下...不过这里还有一点存疑,按照上面的分析,即使是在选中父进程的情况下,只要能够kill掉一个子进程,则OOM Killer就会退出,简单的测试程序测试的结果也的确如此,那为什么现网会出现父进程也被kill掉的情况呢

    2.4K40

    【Linux 进程控制】—— 进程亦生生不息:起于鸿蒙,守若空谷,归于太虚

    在 Linux中 fork 函数是非常重要的函数,它从已存在进程中创建⼀个新进程。创建出来的新进程叫做子进程,而原进程则称为父进程。...fork 代码后,内核做如下几件事: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 当⼀个进程调用fork之后...fork创建成功: 子进程返回0 父进程返回的是子进程的 pid 为什么给父进程返回子进程的pid,这个问题我们之前已经讨论过: 一个父进程可以创建一个或者多个子进程,父进程需要通过返回值获得新创建的子进程的唯一标识符...为什么需要写时拷贝? 在传统的进程创建方式中,fork() 会直接复制父进程的所有内存空间给子进程。...进程等待 之前我们在讲进程概念的时候讲过,如果父进程创建出子进程后,如果子进程已经退出,父进程却没有对子进程回收,那么就子进程就会变成 “僵尸进程” ,造成内存泄露等问题。

    69500

    Linux进程控制——Linux进程等待

    进程等待必要性 在了解完进程等待的概念后,新的问题出现了,我们为什么要进行进程等待,进程等待的必要性是什么?...进程等待必要性: 若子进程退出,而父进程对它不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...总结拓展 拓展一:父进程如何得知子进程的退出信息 父进程调用wait()/waitpid()来获取子进程的退出信息,调用的接口就传入了一个status参数,而父进程中存在着一个statusp的指针...而子进程在退出时,操作系统就会将退出信号和退出码写到子进程的PCD中 int exit_code; int exit_signal 而退出信号和退出码将会写到这两个变量中, 当我们调用系统调用时,只需要将这两个变量组合写入到变量里...这个就是因为进程具有独立性,父进程无法直接获得子进程的退出信息 总结: 进程等待确实非常有用,它既可以回收僵尸进程,避免造成内存泄漏,也能让父进程能够获取到子进程的退出信息,进程等待我们就先了解这么多

    2.8K10

    【Linux】进程(1)进程概念和进程状态

    用fork函数创建子进程 fork是一个系统调用,存在于头文件中,当执行fork函数之后,当前进程会创建一个子进程,后续的代码会被父进程和子进程分别执行一次。...子进程在创建成功后,fork函数会给子进程返回0,给父进程返回子进程的PID。为什么会给父子进程不同的返回值呢?...因为一个父进程可能会有多个子进程,给父进程返回子进程的PID,更方便父进程对子进程进行管理。而子进程如果想要知道父进程的PID,直接调用getppidh函数即可。...实际上fork函数在执行return语句之前,就已经创建好了子进程,此时就可以通过分支语句来区分给父进程和子进程的返回值。...如果 1 号进程崩溃,系统通常会进入不可用状态,需要重启。 那么为什么子进程会被1号进程领养呢?如果1号进程不领养它,则当子进程死亡后,没有父进程读取信息,就会造成内存泄漏。

    1.1K00

    别再只说“进程”了!深入 Linux 内核看进程如何被调度与管理

    函数创建子进程,在fork函数被调用之前的代码被父进程执行,但是在fork之后父进程与子进程代码共享,创建一个进程本质就是系统多一个进程,多(1):task_struct(2)代码 + 数据....实际上,在fork之后我们通常使用if语句进行分流,即让父进程和子进程做不同的事。 如果子进程创建成功,在父进程返回子进程的pid,而在子进程中返回0. 如果子进程创建失败,则在父进程返回-1....如果父进程对子进程一直不回收的话,那么此时子进程会一直存在,那么会引起内存泄漏的问题. 5.4.1:僵尸进程的危害 进程的退出状态必须被维持下去,因为他要告诉关心她的进程(父进程),你交给我的任务,我办的怎么样了...那么一个父进程创建了多个子进程,就是不回收的话,就会造成内存资源的危害即内存泄漏. 5.5:孤儿进程 在Linux当中的进程关系大多数是父子关系,若子进程先退出而父进程没有对子进程的退出信息进行读取,那么我们称该进程为僵尸进程...但若是父进程先退出,那么将来子进程进入僵尸状态时就没有父进程对其进行处理,此时该子进程就称之为孤儿进程. 若一直不处理孤儿进程的退出信息,那么孤儿进程就会一直占用资源,此时就会造成内存泄漏。

    17810

    【嵌入式Linux应用开发基础】fork()函数

    在嵌入式 Linux 应用开发中,fork 函数是一个至关重要的系统调用,用于创建新进程。它允许一个进程(父进程)创建一个与自身几乎完全相同的副本(子进程)。...这两个进程(父进程和子进程)在 fork 调用之后,将各自执行后续代码,但具有不同的执行路径。 一、fork 函数概述 1.1. 函数作用 fork 函数通过复制调用它的进程来创建一个新进程。...返回值 fork 函数返回一个 pid_t 类型的值,该值有三种情况: 在父进程中:fork函数返回新创建的子进程的进程ID(PID)。父进程可以通过这个 PID 来识别和管理子进程。...返回值:fork 函数在父进程和子进程中返回不同的值,这是区分父子进程的关键。 资源使用:虽然子进程复制了父进程的资源,但在实际运行中,父子进程对资源的使用是相互独立的。...多线程环境下的风险 fork() 仅复制调用线程,其他线程在子进程中“消失”。 风险:若父进程其他线程持有锁,子进程可能死锁或数据不一致。

    12110

    【Linux】Linux进程控制——进程创建、进程终止及进程等待详解

    ⭐进程创建 fork函数初识 在Linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...#include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后,内核做: 分配新的内存块和内核数据结构给子进程...将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 当一个进程调用 fork 之后,就有两个二进制代码相同的进程。...例如,父进程等待客户端请求,生成子进程来处理请求。 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。...⭐进程等待 进程等待的必要性 在Linux进程提到过,子进程退出,父进程如果不管不顾,不读取子进程的退出信息,就可能造成“僵尸进程”的问题,进而造成内存泄漏。

    2.6K10

    【嵌入式Linux应用开发基础】特殊进程

    当子进程退出后,它会发送一个SIGCHLD信号给父进程,通知父进程它已经结束。如果父进程没有处理这个信号或者没有调用wait()系列函数来清理子进程的状态,子进程就会变成僵尸进程。...父进程调用 wait() 后,会获取子进程的退出状态,并释放子进程的相关资源。...产生原因 孤儿进程通常是由于父进程在创建子进程后,未等待子进程结束就提前退出而产生的。这种情况可能出现在多种场景中,例如: 父进程完成了自身的任务后正常退出,而子进程仍在执行某些耗时的操作。...守护进程的常见问题 问题1:资源泄漏 现象:守护进程长时间运行后内存或文件描述符泄漏,导致系统资源耗尽。 原因: 未正确关闭文件描述符、套接字或动态分配的内存。...问题2:预期外的行为 现象:孤儿进程逻辑依赖父进程状态(如共享内存)。 原因:父进程终止后,子进程仍尝试访问无效资源。

    13610

    【Linux篇】进程入门指南:操作系统中的第一步

    ,用于获取当前进程的 PID(Process ID),在子进程中调用 getpid(),返回的是子进程自身的 PID。...问题1:为什么fork给父子返回各自不同的返回值? 父进程中的返回值: fork() 在父进程中返回 子进程的 PID(进程 ID)。这个 PID 是一个正整数,唯一标识子进程。...父进程可以使用该 PID 来跟踪子进程,执行如等待子进程结束、获取子进程的状态等操作。 子进程中的返回值: 在子进程中,fork() 返回 0。...子进程:子进程返回0,子进程用这个值来判断自己是子进程,以执行不同于父进程代码逻辑(比如初始化、执行任务等)。 fork返回负值,表示fork调用失败(资源不足等)它会返回 -1,并且没有子进程创建。...通过设置 SIGCHLD 信号处理函数,父进程可以在子进程结束时自动清理。 避免父进程直接退出 父进程应该在子进程完成后再退出,例如通过使用 wait() 等系统调用等待子进程完成后再退出。

    30010

    【Linux】 进程控制(二):进程等待(waitwaitpid) 与 子进程获取(status)

    引言在Linux进程管理中,子进程退出后若父进程未及时回收其资源,会产生僵尸进程并引发内存泄漏问题,而wait与waitpid作为核心的进程等待系统调用,不仅能解决僵尸进程问题,还能让父进程获取子进程的退出状态...目录一、进程等待的必要性子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...:前2秒内,子进程处于运行状态(循环打印信息并休眠),父进程则进入4秒的休眠阶段,二者均处于活跃状态;2秒后子进程执行完循环逻辑并退出,但此时父进程仍在休眠中,无法立即调用wait()系统调用回收子进程资源...,僵尸进程状态消失;父进程在完成子进程回收后,会继续执行2秒的休眠逻辑,因此这一阶段能观察到系统中仅有父进程处于运行状态的场景。...思考:当我们让子进程进入死循环无法退出时,父进程调用wait()后会一直停在该调用处,持续等待子进程退出事件的发生;在此期间父进程完全无法执行后续任何任务,这种现象在操作系统中被称为什么?

    14510

    【寻找Linux的奥秘】第八章:进程控制

    原因前面我们也讲过了,当进程调用fork时,也就是程序在执行内核中的fork代码时,在函数中会依次进行下列操作: 分配新的内存块和内核数据结构给⼦进程。 将⽗进程部分数据结构内容拷⻉⾄⼦进程。...也就是说,在fork函数还没有执行完时,子进程就已经被创建出来了,并且和父进程拥有相同的代码和数据,所以父进程和子进程都会有自己的返回值在fork中。...进程等待 3.1 等待的必要性 前面我们说过,当子进程退出时,父进程如果不管不顾,子进程就会进入僵尸状态,从而造成内存泄漏。...在上面的代码中我们发现获取到了子进程的退出信息后status的值与我们的预期不同,那么这是为什么呢?...最重要的就是回收子进程资源,避免内存泄漏;同时也可以去获取子进程的退出信息,这也是僵尸状态存在的意义。 4.

    35010

    【Linux】————进程控制

    二、进程创建: 1.作者主页 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 ​...进程调用fork,当控制转移到内核中的fork代码后,内核做: ​ 当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。...例如,父进程等待客户端请求,生成子进程来处理请求。 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。 4.fork调用失败的原因 系统中有太多的进程。...之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...2.进程程序替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。

    37310

    进程生命周期管理:从创建到终止的完整逻辑

    进程创建 1.1 fork函数初始 在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...#include pid_t fork(void); 返回值:⾃进程中返回0,⽗进程返回⼦进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后,内核做:...分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 当一个进程调用fork之后,就有两个二进制代码相同的进程...例如,父进程等待客户端请求, 生成子进程来处理请求。 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。 1.5 fork调用失败原因 1....进程等待 3.1 进程等待必要性 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。

    19410
    领券