В настоящее время я пишу приложение на C, ориентированное на системы BSD и Linux, в надежде стать в целом переносимым.Эта программа является зависимостью времени выполнения, в данном случае mplayer.
В ее нынешнем виде я использую execlp()
для запуска mplayer.Я проверяю код ошибки вызова execlp и проверяю EACCESS
, поэтому я знаю, когда я пытаюсь запустить mplayer, если он существует или нет.
Из-за того, как работает моя программа, mplayerтребуемая зависимость, но не может использоваться в течение некоторого времени после запуска моей программы.Как пользовательский опыт, программа плохо работает некоторое время, прежде чем перестает работать из-за отсутствия mplayer.Поэтому я хотел бы проверить наличие mplayer при запуске моей программы.Возможно, выдает сообщение об ошибке, если mplayer недоступен.
Теперь я понимаю, что здесь есть условие гонки, поэтому моя текущая обработка ошибки EACCESS
должна остаться.Мы могли бы найти ситуацию, когда пользователь запускает мою программу, а затем удаляет mplayer.Это принято.
Моя первоначальная мысль состояла в том, чтобы вызвать execlp()
на раннем этапе выполнения, однако это приводит к тому, что mplayer явно запускается.Честно говоря, я бы предпочел не запускать mplayer, а просто протестировать, смогу ли я его запустить (например, существует ли файл под названием mplayer где-то на моем пути и исполняем ли он).затем выполнить эти точные шаги, просматривая путь и проверяя, является ли соответствующий файл исполняемым.Я еще не закодировал это по двум причинам.Первая причина, чтобы быть уверенным, что execlp находит то же самое, что и я, я должен был бы передать обнаруженное имя пути в execlp, минуя встроенный механизм поиска PATH.Другая причина заключается в том, что я просто упускаю очевидный трюк.
Есть ли функция, которую я должен использовать для поиска исполняемого файла?Или мне действительно нужно просто продолжить и закодировать это долгий путь.