【问题标题】:CreateProcess + CREATE_SUSPENDED flag equivalent in Linux?Linux 中的 CreateProcess + CREATE_SUSPENDED 标志等效?
【发布时间】:2019-02-04 03:38:32
【问题描述】:

我想知道是否有办法让进程暂停?

类似于 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 方法将不起作用,因为进程退出速度非常快。

【问题讨论】:

  • PTRACE_O_TRACEEXEC 选项似乎符合要求。

标签: c linux debugging process


【解决方案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);
}

【讨论】:

  • 您说“此行应仅在发送 CONT 信号后开始执行”,但未提供详细信息。 CONT 信号是如何发送的?谁寄的?我正在尝试移植一个应用程序,该应用程序使用 CreateProcessW 启动另一个暂停的进程,显示一个消息框,然后在按下 OK 按钮时继续新进程。这可以用来复制该功能吗?
【解决方案2】:

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>

【讨论】:

  • 更新问题
  • 您实际上可以在执行工作后立即获得 PID,我为您更新了答案。
【解决方案3】:

文章Creating suspended processes 为这个问题提供了一个很好的答案。请注意,本文存在问题。这篇文章的作者 Scott Knight 显然没有费心去确认他的代码示例是否真的可以编译。父函数引用了一个神秘的 pid 变量。

可以在我的StartSuspended 项目中找到一个完整的工作示例。我的 StartSuspended 项目在 Microsoft Windows 和 GNU/Linux 上编译。请参阅StartSuspendedPlatformPosix.cpp 了解 GNU/Linux 实现。

我在 GNU/Linux 实现中使用了以下函数。

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多