Я делаю следующие шаги в моем коде:
fork()
execv
в дочернем процессе для запуска внешнего скрипта While( waitpid(..., WNOHANG) == 0)
{
//Send signal that script has started with no error
..
}
Проблема, с которой я сталкиваюсь, заключается в том, что если сценарий не является исполняемым, я все равно заканчиваю вышеописанный цикл while, и я посылаю сигнал, что скрипт запущен без ошибок; что неверно.
Очевидно, я могу запустить вызов sys и определить разрешение скрипта перед началом работы, но есть ли лучшее решение?
execve
ошибок execve
является сложным по той причине, что вы нашли: ошибка наблюдается в дочернем процессе, но вы хотите перенести ее в родительский процесс. Там хороший трюк, чтобы сделать это возможным:
Перед форкированием откройте pipe
и установите флаги close-on-exec (с pipe2
и O_CLOEXEC
или fcntl
если первая из них недоступна в вашей системе).
После разветвления родитель закроет сторону письма трубы и прочитает с конца считывания.
В ребенке закройте считывающий конец трубы и execve
. Если это не удается, напишите errno
в pipe и _exit
.
В родительском, если read
возвращает 0, execve
был успешным. Это связано с тем, что успешный execve
закрывает канал (потому что он установлен для close-on-exec) и вызывает EOF на конце считывания. В противном случае прочитанное значение является кодом ошибки.
Попросите ребенка выйти (2) или какое-либо другое значение, если оно все еще существует после того, как он выполнит скрипт, и проверьте значение выхода внутри родительского цикла. Но почему цикл? Просто избавьтесь от WNOHANG.