Как контролировать выполнение родительского процесса после вызова 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
,