Waitpid для дочернего процесса, который выполняет неисполняемый скрипт

0

Я делаю следующие шаги в моем коде:

  • fork()
  • execv в дочернем процессе для запуска внешнего скрипта
  • в родительском процессе:

 While( waitpid(..., WNOHANG) == 0)
 {
     //Send signal that script has started with no error
      ..
 }

Проблема, с которой я сталкиваюсь, заключается в том, что если сценарий не является исполняемым, я все равно заканчиваю вышеописанный цикл while, и я посылаю сигнал, что скрипт запущен без ошибок; что неверно.

Очевидно, я могу запустить вызов sys и определить разрешение скрипта перед началом работы, но есть ли лучшее решение?

  • 0
    Даже если вы проверили разрешения, которые сами по себе не являются гарантией успеха execve. (Интерпретатор может не существовать или быть исполняемым, двоичный файл может быть недействительным, могут быть превышены некоторые ограничения ресурсов и т. Д.). Даже если вы проверили все это, у вас все равно будет состояние гонки.
Теги:

2 ответа

3

execve ошибок execve является сложным по той причине, что вы нашли: ошибка наблюдается в дочернем процессе, но вы хотите перенести ее в родительский процесс. Там хороший трюк, чтобы сделать это возможным:

  1. Перед форкированием откройте pipe и установите флаги close-on-exec (с pipe2 и O_CLOEXEC или fcntl если первая из них недоступна в вашей системе).

  2. После разветвления родитель закроет сторону письма трубы и прочитает с конца считывания.

  3. В ребенке закройте считывающий конец трубы и execve. Если это не удается, напишите errno в pipe и _exit.

  4. В родительском, если read возвращает 0, execve был успешным. Это связано с тем, что успешный execve закрывает канал (потому что он установлен для close-on-exec) и вызывает EOF на конце считывания. В противном случае прочитанное значение является кодом ошибки.

0

Попросите ребенка выйти (2) или какое-либо другое значение, если оно все еще существует после того, как он выполнит скрипт, и проверьте значение выхода внутри родительского цикла. Но почему цикл? Просто избавьтесь от WNOHANG.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню