CreateProcess+;在Linux中创建等效的挂起标志?

CreateProcess+;在Linux中创建等效的挂起标志?,c,linux,debugging,process,C,Linux,Debugging,Process,我想知道是否有办法启动暂停的进程 与windows中挂起的CreateProcess+CREATE_类似: CreateProcessA( NULL, CmdLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, "C:\\Windows\\System32\\", &si,

我想知道是否有办法启动暂停的进程

与windows中挂起的CreateProcess+CREATE_类似:

CreateProcessA(
        NULL, 
        CmdLine, 
        NULL, 
        NULL, 
        FALSE, 
        CREATE_SUSPENDED,
        NULL, 
        "C:\\Windows\\System32\\", 
        &si, 
        &pi);
ptrace似乎只支持ptrace_ATTACH,无法启动进程并直接挂起它,有什么想法吗

编辑

我需要能够捕捉到这样的过程

int main()
{
   exit(0);
}

因此,shell方法将不起作用,因为该过程退出得非常快。

对于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>
###要启动流程:
#!/bin/bash
函数\u some\u proc(){
回音“嗨”
#如果这太快了,你可以用“睡眠”来增加一些时间
}
函数\u一些\u程序&
FOO_PID=$!
“回音”
echo$FOO_PID
“回音”
###然后暂停
停止
#恢复
杀死控制

一种可能的方法是将流程细节作为流程、fork和child中的输入,在执行流程之前,向self发送停止信号

示例代码:

#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);
}
#包括
#包括
#包括
#包括
main()
{
int-pid;
//注意:用相应的二进制和参数替换argv_列表
//还可以从main(argc、argv)获取这些值作为命令行参数
char*argv_list[]={/usr/bin/ls“,“-lrt”,“/”,NULL};
如果((pid=fork())==0)
{
printf(“子执行\n”);
//向self发送停止信号以暂停
kill(getpid(),SIGSTOP);
//停止信号处理程序暂停当前进程的休眠
睡眠(1);
//只有在发送CONT信号后,该行才会开始执行。
execv(argv_列表[0],argv_列表);
}
其他的
{
printf(“子PID:%d,父继续\n”,PID);
}
printf(“\n***主-退出\n”);
出口(0);
}
这篇文章为这个问题提供了一个很好的答案。请注意,本文存在一些问题。这篇文章的作者斯科特·奈特(ScottKnight)显然没有费心确认他的代码示例是否会编译。父函数引用了一个神秘的pid变量

在我的项目中可以找到一个完整的工作示例。我的StartSpended项目在Microsoft Windows和GNU/Linux上编译。有关GNU/Linux实现,请参阅

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


更新的问题您可以在执行作业后立即获得PID,我为您更新了我的答案。
PTRACE\u O\u TRACEEXEC
选项似乎符合要求。您说“只有在发送CONT信号后才应开始执行此行”,但没有提供详细信息。CONT信号是如何发送的?谁寄的?我正在尝试移植一个应用程序,该应用程序使用CreateProcessW启动另一个挂起的进程,显示一个消息框,然后在按下OK按钮时继续新进程。这是否可以用于复制该功能?