Estoy programando en C para crear una API para un dispositivo integrado. Este dispositivo integrado ejecuta una variante de Linux. No estoy muy familiarizado con C, estoy más familiarizado con shell scripting/bash.
Con eso en mente, cuando se trata de cosas como verificar si existe un directorio u obtener el uso del disco, me resulta más fácil simplemente hacer una llamada al system o popen y ejecutar mi comando, luego analizar la salida. Es más rápido para mí como desarrollador.
¿Hay inconvenientes en hacer estas llamadas al system y popen en lugar de descubrir cómo hacer cada una de estas cosas en C y luego hacer uso de las funciones de C?
Incluso si va a funcionar en Linux, no puede confiar en la disponibilidad de todos los comandos que pretende usar, por lo que la desventaja es sencilla: no puede confiar en que una herramienta determinada esté disponible .
Una cosa más a considerar es que analizar la salida de los comandos de shell desde c es terriblemente difícil.
Y finalmente, no puede hacer que su programa llame aleatoriamente a una utilidad del sistema o script de shell simplemente porque no es seguro.
Contras:
Ventajas:
system("ls -1");resumir -
Depende de lo que tengas que hacer, pero en general hay más aspectos negativos que positivos.
Al final del día, en un sistema Linux, prácticamente todo está llamando a funciones C en algún momento.
Para tocar algunos de los argumentos en los comentarios, así como mis propios pensamientos:
EDITAR para abordar el comentario de Pimgd: tenga en cuenta que las condiciones de carrera son un dolor de cabeza y muchas de ellas no son necesariamente un problema para su caso de uso particular, pero al menos vale la pena considerarlas al sopesar los pros y los contras. De todos modos, las instancias específicas de condición de carrera en las que estaba pensando incluyen (y es probable que haya otras clases):
Condiciones de carrera multiproceso. El ejemplo más simple que se me ocurre es lo que sucede si dos instancias de su programa desean configurar un archivo de configuración y se ejecutan al mismo tiempo. Hay ciertas llamadas al sistema operativo que tienen ciertos niveles de garantía de atomicidad, pero se pierde mucho si llama a una serie de comandos de shell para escribir en el archivo. (Tenga en cuenta que incluso si lo hace desde una aplicación C monolítica en lugar de una serie de comandos de shell, aún necesitaría hacer algo adicional para evitar que la instancia 1 sobrescriba el cambio de la instancia 2, pero al menos no es probable que se encuentre con el caso de que termine teniendo cambios entremezclados. Como ejemplo, considere:
ARCHIVO *fp = fopen("config.txt","wt");
fprintf(fp,"Valor de configuración 1: %s",config[0]);
fprintf(fp,"Valor de configuración 2: %s",config[1]);
fflush(fp);
fcerrar(fp);
contra
system("echo Config value 1: `df | awk '{print $1}'` > config.txt"); system("echo Config value 2: `ps | grep foo | awk '{print $2}'` >> config.txt");Donde, si dos instancias del programa se ejecutan casi a la hora exacta, puede terminar con, por ejemplo, 2 instancias del valor de configuración 2 en el archivo de configuración en el último caso.