Как контролировать выполнение родительского процесса после вызова execl() в C-программе?

У меня есть простая программа на C, которая выполняет приложение, используя fork () и execl (). Если execl () не может запустить приложение, я должен вызвать функцию в родительском процессе и выйти из дочернего процесса. Если execl () успешно запускает приложение, я должен показать журнал успеха от родительского процесса. Таким образом, родительский процесс должен дождаться вызова дочерней функции execl () (только вызов, а не до конца выполнения приложения), получить некоторую информацию о его состоянии, а затем принять решение и продолжить свое собственное выполнение. Вот мой код

int main()
{
    int iExecRetVal, pid;
    pid = fork();

    if (pid == -1)
    {

    }
    else if (pid > 0)
    {
    }
    else
    {
        iExecRetVal = execl("./flute-static", "./flute-static", "-send", "-a192.168.190.1/6666", "JFlute.1.2.tar.gz", NULL);
        if (iExecRetVal == -1)
        {
            /*execl() failed, need some error handling in the parent process*/
        }
        _exit(0);
    }

    /*Parent's normal execution*/
}

int HandleSuccessFromParent()
{
    /*Should be called when exec call was successful*/
}

int HandleFailureFromParent()
{
    /*Should be called when exec call was NOT successful*/
}

Мы знаем, что execl () не возвращается в случае успеха. Итак, как правильно вызывать функции HandleSuccessFromParent() и HandleFailureFromParent() после вызова execl () в дочернем элементе. Пожалуйста, помогите мне.

2 ответа

Дочерний процесс должен завершиться со статусом ошибки (ненулевым; 1 является общим, EXIT_FAILURE это стандарт С).

Родительский процесс должен дождаться завершения работы дочернего элемента и зафиксировать состояние выхода дочернего элемента, используя wait() или же waitpid(),

Если вам нужно знать, умер ли ребенок, но не хотите ждать его завершения, используйте waitpid() с WNOHANG после небольшой паузы, чтобы позволить ребенку попытаться бежать (задержка в одну секунду, вероятно, будет достаточно продолжительной).

Одно из возможных решений включает ptrace, Схема выглядит следующим образом:

Пусть ребенок позвонит ptrace(PTRACE_TRACEME), Позвольте родителю включить PTRACE_O_TRACEEXEC вариант и waitpid на ребенка. В этой настройке waitpid вернется после успешного execl, Проверьте статус, чтобы увидеть, есть ли у него SIGTRAP флаг установлен. Пусть ребенок продолжит PTRACE_DETACH,

Другие вопросы по тегам