saber si programa esta instalado ? [Solucionado]

Estimados.
Necesito saber si existe alguna funcion en C-C++ con la cual pueda saber si esta instalado X programa.
Por ej. Perl, Python, etc., la idea es tener una funcion que funcione tanto en linux como en windows, para poder avisarle a la persona primero que debe instalar tal programa antes de continuar.
En linux lo he hecho en script bash capturando la salida de "test -f /usr/bin/programa"
Pero la idea es tener una funcion que funcione en ambos sistemas.
La verdad es que no tengo idea ni por donde empezar a buscar en google.

Saludos y muchas gracias.

A primera vista, hay una solución bastante sencilla. Pregunta en qué sistema estás: si estás en Linux usas test -f, y si estás en Windows el equivalente (que no sé cual es).

No sé si te valdrá, es lo que parece más intuitivo.

a mi se me ocurre otra posibilidad, simplemente no comprobar si existe el programa, intentar ejecutarlo, que existe? pues nada, que no existe? pues en caso de error avisar al usuario de que lo instale y volver al paso anterior a la espera de que el usuario le de a reintentar.

Es un poco complicado lo que necesitas primero por como se organizan los ejecutables en sistemas tipo UNIX y de como se organizan actualmente en Windows (hasta Windows 3.1 las cosas eran más obvias, después la fastidiaron).

Me explicaré, en un sistema tipo UNIX existe una variable de entorno/sistema que indica donde han de buscarse posibles rutas a ejecutables que el usuario puede ejecutar, dicha variable se llama "PATH", puedes ver su valor haciendo un:

$ echo $PATH

El lenguaje C/C++ y prácticamente todos los lenguajes disponen (aunque ahora no recuerdo como se accede desde C/C++) de alguna función para acceder a estas variables de entorno, pero si la obtienes sólo has de recorrer dichas carpetas en busca de tu ejecutable favorito.

Esto no es la norma pero si la costumbre aunque puede cambiar en el futuro, pero funciona la mayoría de veces.

Bien esto para sistemas tipo UNIX, para Windows la cosa es más fea. Bajo Windows tambien hay variables de entornos y hay una tambien llamada PATH, esta apuntará también a las rutas donde están los ejecutables. Pero no apunta a todas las ubicaciones, me explicaré, si el programa se instaló en una carpeta X dentro de por ejemplo "C:\Archivos de programa" y no modificó explícitamente la variable PATH es muy probable que no encuentres el ejecutable, aunque si es probable que hayan modificado el registro de Windows para asociar a una extensión el ejecutable por ejemplo, o aparezca alguna mención en el escritorio o menús contextuales, etc.

Como dije, esto no ocurría antes de Window 95 (es decir, Windows 3.1), antes se incluía una nueva ruta dentro de la variable PATH para apuntar al ejecutable, pero debido a las limitaciones propias del DOS (sobre el que corría Windows 3.1) decidieron utilizar otro modo para localizar los binarios utilizando entradas en el menú de inicio, entradas en el registro, iconitos sobre el escritorios, menús contextuales, etc.

Así bajo Windows buscar la presencia de un cierto fichero ejecutable no se garantiza utilizando esta variable de entorno PATH para buscar en esas rutas.

Yo utilizo bajo Windows la variable PATH y accedo al registro de Windows para buscar ciertas huellas del programa.

Lo que comenta Shaola también es posible pero sólo funcionará bajo un sistema tipo UNIX, en Windows si intentas ejecutar un programa desde las funciones estándares de C intentará hallar su ruta en la variable PATH. Pero existe otra función para llamar programas que se han registrado en el sistema aunque no estén en el PATH una función como por ejemplo la ShellExecute del API de Windows que sirve entre otras cosas para iniciar una aplicación Windows por medio del tipo de archivo que se le pase.

nerve_net escribió:

El lenguaje C/C++ y prácticamente todos los lenguajes disponen (aunque ahora no recuerdo como se accede desde C/C++) de alguna función para acceder a estas variables de entorno, pero si la obtienes sólo has de recorrer dichas carpetas en busca de tu ejecutable favorito.

Por si sirve de algo, la función es getenv, y hay que incluir stdlib.h.

Gracias por la info, he usado la funcion función es getenv(), pero no tengo como saber por ejemplo la ruta de python.
Las unicas variables utiles que pude obtener fueron:
TERM, SHELL, USER, PATH, DESKTOP_SESSION, LANG, HOME y LOGNAME.

He creado una propuesta en la cual lanzar la aplicacion y si falla mostrar error:
El problema es como tengo python instalado no se si funciona bien.

  if (Py_Initialize( ) == NULL) {
      error("Can't load Python");
  }
  else {
      Py_Initialize( );
      printf("Python loaded");
  }

Lo que estoy tratando de hacer es cargar python, en caso que falle mostrar el error o dar un mensaje mas explicativo. Por el contrario si carga continuar con el programa.

Saludos

Finalmente he encontrado en google una funcion mas optima:
Py_Initialize( );
if (!Py_IsInitialized()) {
error("mensaje de error a mostrar");
return 1;
}