Quiero ejecutar un comando de terminal de Linux en un programa C. Actualmente estoy usando la función system() pero quiero usar cualquier otra ya que la función system() está prohibida según MISRA.
Por ejemplo, ¿cómo puedo reemplazar
system("hwclock --systohc --utc");Primero puede usar fork() para crear un proceso secundario, luego, en el proceso secundario, puede llamar a exec() para ejecutar el comando que desee.
Hay un ejemplo sencillo:
$ chmod u+x command.sh $ cat command.sh #!/usr/bin/env bash
ls-l
************* prueba.c ****************
#include<unistd.h> int main(void) { execl("./command.sh","command.sh",(char*)0); return 0; }Esta es una pregunta muy interesante. Mi comprensión de MISRA C es que proporciona pautas para el uso del lenguaje C en sistemas críticos. Pero la biblioteca estándar del lenguaje C, que incluye la función del system , es simplemente una pequeña parte de la suma total del código de la biblioteca que se usa normalmente en las aplicaciones modernas, a menudo incluso en los sistemas integrados.
Nunca he desarrollado una aplicación según los estándares de MISRA y solo he podido encontrar una versión un poco más antigua (de 2004) de las pautas de MISRA. Por lo que puedo decir, MISRA guarda silencio sobre el uso de las funciones de la biblioteca POSIX, que normalmente tendrá disponibles en cualquier tipo de sistema basado en Linux. Si MISRA realmente guarda silencio sobre las funciones de la biblioteca POSIX, entonces es lógico que cualquier función en la biblioteca POSIX no debe estar restringida. Eso incluiría fork , exec y popen , que están definidos por POSIX, no por el estándar del lenguaje C. De los tres, popen es probablemente el más similar en funcionalidad/interfaz a la función del system C.
Dicho esto, es posible que desee preguntarse por qué MISRA C restringe el uso de la función del system y si la misma razón se aplica o no al uso de las tres funciones anteriores.