2015-05-19 2 views
3

Я хотел бы следующее поведение без использования systemКак узнать, установлено ли в системе меньше?

int ret = system("less -V > /dev/null 2>&1"); 
if (ret == 0) { 
    printf("The less executable was found.\n"); 
} 

мне нужна переменная ret быть 0, если меньше, установлен в системе, но без использования вызова system. Можно ли это сделать с exec или аналогичным?

+2

* но без использования вызова 'system' *. Это странное требование. –

+0

Да, очень странно. Вам понадобится fork() и, вероятно, захотите использовать execlp(), и это будет работать только на Linux, а не на BSD на базе Unix (как описано здесь (http://man7.org/linux/man-pages/man3/exec. 3.html) – GroovyDotCom

+0

Это наше требование, чтобы узнать C, что мы не «обманываем» и используем системный вызов, потому что проблема является частью упражнения, чтобы изучить C89 без использования системного вызова, если это возможно. –

ответ

2

Чтобы определить, установлен ли less, вы можете использовать system("which less"). Это позволяет избежать попытки вызвать less, если он не установлен. Если вы вообще не хотите использовать system, вам нужно будет повторно реализовать функциональность which в вашей программе: например, используйте getenv, чтобы получить переменную PATH, и попробуйте добавить /less к каждому пути и вызывать stat в результате файл, чтобы определить, существует ли он и является исполняемым.

+0

Можете ли вы уточнить, потому что Я никогда не использовал 'stat' раньше? –

+1

@Niklasinstockholm Это системный вызов, а не часть стандарта C, но стандартизованный как часть POSIX. Он дает вам метаданные, связанные с файлом. – Atsby

Смежные вопросы