Эквивалентный флаг CreateProcess + CREATE_SUSPENDED в Linux? - PullRequest
0 голосов
/ 04 февраля 2019

Мне интересно, есть ли способ запустить процесс, приостановленный?

Похоже на CreateProcess + CREATE_SUSPENDED в Windows:

CreateProcessA(
        NULL, 
        CmdLine, 
        NULL, 
        NULL, 
        FALSE, 
        CREATE_SUSPENDED,
        NULL, 
        "C:\\Windows\\System32\\", 
        &si, 
        &pi);

ptrace поддерживает только PTRACE_ATTACH, нет способазапустить процесс и приостановить его напрямую, есть идеи?

РЕДАКТИРОВАТЬ

Мне нужно иметь возможность отлавливать такой процесс,

int main()
{
   exit(0);
}

Таким образом, подход оболочки не будет работать, поскольку процесс завершается очень быстро.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Один из возможных подходов состоит в том, чтобы принять подробности процесса в качестве входных данных процесса, разветвления и потомка перед выполнением процесса, отправить сигнал остановки самому себе.

Пример кода:

#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);
}
0 голосов
/ 27 марта 2019

Статья Создание приостановленных процессов дает отличный ответ на этот вопрос.Обратите внимание, что есть проблемы с этой статьей.Скотт Найт, автор статьи, очевидно, не удосужился подтвердить, что его примеры кода действительно скомпилируются.Родительская функция ссылается на загадочную переменную pid.

Полный рабочий пример можно найти в моем проекте StartSuspended .Мой проект StartSuspended компилируется в Microsoft Windows и GNU / Linux.См. StartSuspendedPlatformPosix.cpp для реализации GNU / Linux.

Я использовал следующие функции в реализации GNU / Linux.

0 голосов
/ 04 февраля 2019

Не существует сравнения «один-к-одному» для оболочки, но вот то, что похоже на вращение процесса, затем его приостановку и затем повторный запуск.

###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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...