Это неэффективно (требуется разветвление и выполнение /bin/sh). Там должен быть лучший путь! Но как общий подход ... Всегда есть system().
(Не забудьте использовать WEXITSTATUS()! Берегись для создания программ Бесперебойное!)
#define SHOW(X) cout << # X " = " << (X) << endl
int main()
{
int status;
SHOW(status = system("which grep > /dev/null 2>&1"));
SHOW(WEXITSTATUS(status));
SHOW(status = system("which no_matching_file > /dev/null 2>&1"));
SHOW(WEXITSTATUS(status));
}
Существует также POPEN(), что может быть полезно для захвата выход из программы для проверки версии номера, библиотеки или еще много чего.
Если вам нужно двунаправленные (чтение & записи) доступ к подпроцессу, лучше использовать трубы(), вилки(), Exec(), близко(), & dup2().
Существует оговорка: если пользователь установил что-то, не используя соответствующий менеджер пакетов (используя make install напрямую), вы не обнаружите его. –