在Linux中是否等同于CreateProcess + CREATE_SUSPENDED标志?

时间:2019-02-04 03:38:32

标签: c linux debugging process

我想知道是否有一种方法可以暂停进程?

类似于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方法将无法正常运行,因为该过程退出的速度非常快。

3 个答案:

答案 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实现中使用了以下功能。