La funzione system
invoca una shell per eseguire il comando. Mentre questo è conveniente, è noto allo security implications. Se è possibile specificare completamente il percorso del programma o dello script che si desidera eseguire e si può permettere di perdere l'indipendenza dalla piattaforma fornita da system
, è possibile utilizzare un wrapper execve
come illustrato nella seguente funzione exec_prog
per eseguire in modo più sicuro il programma. .
Ecco come si specificano gli argomenti del chiamante:
const char *my_argv[64] = {"/foo/bar/baz" , "-foo" , "-bar" , NULL};
quindi chiamare la funzione exec_prog
in questo modo:
int rc = exec_prog(my_argv);
Ecco la funzione 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;
}
Ricordate il include:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
Vedi related SE post per situazioni che richiedono la comunicazione con il programma eseguito tramite descrittori di file come stdin
e stdout
.
fonte
2014-11-27 14:27:41
Perché questa domanda richiede codice C ed è contrassegnata con C++? – Johan