La función system
invoca un shell para ejecutar el comando. Si bien esto es conveniente, es bien conocido por security implications. Si puede especificar completamente la ruta del programa o script que desea ejecutar y puede permitirse perder la independencia de plataforma que proporciona system
, puede usar un contenedor execve
como se ilustra en la función exec_prog
a continuación para ejecutar su programa de manera más segura. .
Así es como se especifica los argumentos de la persona que llama:
const char *my_argv[64] = {"/foo/bar/baz" , "-foo" , "-bar" , NULL};
Luego llama a la función exec_prog
así:
int rc = exec_prog(my_argv);
Aquí está la función exec_prog
:
static int exec_prog(const char **argv)
{
pid_t my_pid;
int status, timeout /* unused ifdef WAIT_FOR_COMPLETION */;
if (0 == (my_pid = fork())) {
if (-1 == execve(argv[0], (char **)argv , NULL)) {
perror("child process execve failed [%m]");
return -1;
}
}
#ifdef WAIT_FOR_COMPLETION
timeout = 1000;
while (0 == waitpid(my_pid , &status , WNOHANG)) {
if (--timeout < 0) {
perror("timeout");
return -1;
}
sleep(1);
}
printf("%s WEXITSTATUS %d WIFEXITED %d [status %d]\n",
argv[0], WEXITSTATUS(status), WIFEXITED(status), status);
if (1 != WIFEXITED(status) || 0 != WEXITSTATUS(status)) {
perror("%s failed, halt system");
return -1;
}
#endif
return 0;
}
Recuerde la incluye:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
Ver related SE post para situaciones que requieren la comunicación con el programa ejecutado a través de descriptores de archivos tales como stdin
y stdout
.
¿Por qué esta pregunta pide el código C y está etiquetada con C++? – Johan