我想知道是否有一种方法可以暂停进程?
类似于Windows中的CreateProcess + CREATE_SUSPENDED:
CreateProcessA(
NULL,
CmdLine,
NULL,
NULL,
FALSE,
CREATE_SUSPENDED,
NULL,
"C:\\Windows\\System32\\",
&si,
&pi);
ptrace似乎仅支持PTRACE_ATTACH,没有办法启动进程并直接挂起它,有什么想法吗?
编辑
我需要能够捕获这样的过程,
int main()
{
exit(0);
}
因此,shell方法将无法正常运行,因为该过程退出的速度非常快。
答案 0 :(得分:1)
一种可能的方法是在执行过程之前,将过程详细信息作为过程,fork和子进程中的输入,向自身发送停止信号。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
main()
{
int pid;
//Note: Replace argv_list with corresponding binary and arguments
//Can also get these values as command line argument from main(argc, argv)
char *argv_list[] = {"/usr/bin/ls","-lrt", "/", NULL};
if((pid=fork())==0)
{
printf("Child Executing\n");
//Send STOP signal to self to suspend
kill(getpid(), SIGSTOP);
//Sleep for stop signal handler to suspend current process
sleep(1);
//This line should start to execute only after CONT signal is sent.
execv(argv_list[0],argv_list);
}
else
{
printf("Child PID:%d, Parent continuing\n", pid);
}
printf("\n***Main - Exiting\n");
exit(0);
}
答案 1 :(得分:0)
对于shell没有一对一的比较,但是在旋转一个过程然后挂起它然后再次启动它方面,这是相似的。
###to start a process:
#!/bin/bash
function_some_proc() {
echo "hi"
# if this is too fast you can always use "sleep" to add some time
}
function_some_proc &
FOO_PID=$!
echo "--"
echo $FOO_PID
echo "--"
###then to suspend
kill -STOP <PID>
#to resume
kill -CONT <PID>
答案 2 :(得分:0)
文章Creating suspended processes为这个问题提供了一个很好的答案。请注意,本文存在问题。文章的作者Scott Knight显然没有费心去确认他的代码示例是否可以编译。父函数引用了一个神秘的pid变量。
可以在我的StartSuspended项目中找到完整的工作示例。我的StartSuspended项目在Microsoft Windows和GNU / Linux上编译。有关GNU / Linux的实现,请参见StartSuspendedPlatformPosix.cpp。
我在GNU / Linux实现中使用了以下功能。