Функция system
вызывает оболочку для запуска команды. Хотя это удобно, оно хорошо известно последствия для безопасности . Если вы можете полностью указать путь к программе или сценарию, который хотите выполнить, и можете позволить себе потерять независимость от платформы, предоставляемую system
, то вы можете использовать оболочку execve
, как показано в функции exec_prog
ниже для более безопасного выполнения вашей программы.
Вот как вы указываете аргументы в вызывающей стороне:
const char *my_argv[64] = {"/foo/bar/baz" , "-foo" , "-bar" , NULL};
Затем вызовите функцию exec_prog
следующим образом:
int rc = exec_prog(my_argv);
Вот функция 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;
}
Помните, что включает в себя:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
См. сообщение SE, относящееся к , для ситуаций, которые требуют связи с исполняемой программой через дескрипторы файлов, такие как stdin
и stdout
.