C, время выполнения теста, если исполняемый файл существует в PATH - PullRequest
3 голосов
/ 07 ноября 2011

В настоящее время я пишу приложение на C, ориентированное на системы BSD и Linux, в надежде стать в целом переносимым.Эта программа является зависимостью времени выполнения, в данном случае mplayer.

В ее нынешнем виде я использую execlp() для запуска mplayer.Я проверяю код ошибки вызова execlp и проверяю EACCESS, поэтому я знаю, когда я пытаюсь запустить mplayer, если он существует или нет.

Из-за того, как работает моя программа, mplayerтребуемая зависимость, но не может использоваться в течение некоторого времени после запуска моей программы.Как пользовательский опыт, программа плохо работает некоторое время, прежде чем перестает работать из-за отсутствия mplayer.Поэтому я хотел бы проверить наличие mplayer при запуске моей программы.Возможно, выдает сообщение об ошибке, если mplayer недоступен.

Теперь я понимаю, что здесь есть условие гонки, поэтому моя текущая обработка ошибки EACCESS должна остаться.Мы могли бы найти ситуацию, когда пользователь запускает мою программу, а затем удаляет mplayer.Это принято.

Моя первоначальная мысль состояла в том, чтобы вызвать execlp() на раннем этапе выполнения, однако это приводит к тому, что mplayer явно запускается.Честно говоря, я бы предпочел не запускать mplayer, а просто протестировать, смогу ли я его запустить (например, существует ли файл под названием mplayer где-то на моем пути и исполняем ли он).затем выполнить эти точные шаги, просматривая путь и проверяя, является ли соответствующий файл исполняемым.Я еще не закодировал это по двум причинам.Первая причина, чтобы быть уверенным, что execlp находит то же самое, что и я, я должен был бы передать обнаруженное имя пути в execlp, минуя встроенный механизм поиска PATH.Другая причина заключается в том, что я просто упускаю очевидный трюк.

Есть ли функция, которую я должен использовать для поиска исполняемого файла?Или мне действительно нужно просто продолжить и закодировать это долгий путь.

Ответы [ 3 ]

3 голосов
/ 07 ноября 2011

Некоторые системы (FreeBSD, Linux) поддерживают команду which, которая выполняет поиск заданной команды в пути пользователя.

Я полагаю, что в некотором смысле возникает вопрос ... может ли ваш код работатьВ различных системах вам может потребоваться which which, чтобы определить, доступен ли which.;-) Если это проблема, вам, возможно, все же придется подумать о встраивании этой функциональности в вашу программу, но код все еще может быть полезной отправной точкой.

1 голос
/ 07 ноября 2011

с надеждой быть вообще переносимым

Для платформ POSIX, я полагаю?execlp далеко не общедоступен.

Нет портативного способа проверить наличие команды, кроме попытки ее выполнить.Что вы можете сделать, это скопировать логику поиска пути из BSD execlp (пользовательская часть) или BSD's which команда .

0 голосов
/ 07 ноября 2011

Нет определенного способа в ANSI C. Вы можете попробовать fopen () и проверить код возврата.Попробуйте использовать stat call (man 2 stat), он существует в Linux, но я не уверен насчет BSD.

...