python2,已知两个进程的PID分别为117135和868518,如何将117135进程作为子进程挂到868518进程上,换一种解决方法
时间: 2024-03-12 09:46:17 浏览: 57
Python进程,多进程,获取进程id,给子进程传递参数操作示例
在Linux系统中,可以使用`ptrace`系统调用来实现将一个进程作为子进程挂到另一个进程上。具体的做法如下:
1. 在868518进程中调用`ptrace`系统调用的`PTRACE_ATTACH`选项,将117135进程作为子进程挂到868518进程上。代码如下:
```python
import os
import ctypes
# 定义ptrace调用的常量
PTRACE_ATTACH = 0x10
PTRACE_SETOPTIONS = 0x4200
PTRACE_O_TRACEEXEC = 0x00000020
# 获取进程的pid
parent_pid = 868518
child_pid = 117135
# 调用ptrace将child_pid作为子进程挂到parent_pid上
libc = ctypes.CDLL("libc.so.6")
libc.ptrace(PTRACE_ATTACH, child_pid, None, None)
# 等待child_pid进程被挂到parent_pid上
os.waitpid(child_pid, 0)
# 设置ptrace选项,跟踪child_pid进程的执行
libc.ptrace(PTRACE_SETOPTIONS, parent_pid, None, PTRACE_O_TRACEEXEC)
```
2. 在868518进程中调用`ptrace`系统调用的`PTRACE_SYSCALL`选项,让117135进程执行下一个系统调用,并跟踪其运行状态。代码如下:
```python
import os
import ctypes
# 定义ptrace调用的常量
PTRACE_SYSCALL = 24
# 获取进程的pid
parent_pid = 868518
# 跟踪child_pid进程的执行状态
while True:
# 等待child_pid进程执行下一个系统调用
libc = ctypes.CDLL("libc.so.6")
libc.ptrace(PTRACE_SYSCALL, parent_pid, None, None)
os.waitpid(-1, 0)
# 获取child_pid进程当前的系统调用号
syscall_num = libc.ptrace(PTRACE_PEEKUSER, parent_pid, 4 * 17, None)
# 如果child_pid进程执行了exit系统调用,跳出循环
if syscall_num == 60:
break
```
这样,就可以将117135进程作为子进程挂到868518进程上,并跟踪其运行状态。
阅读全文