Амардип прав, system()
в системах типа POSIX запускает команду через /bin/sh
.
Я сомневаюсь, что у вас действительно есть законная необходимость вызывать эти программы, о которых вы говорите, через оболочку Bourne. Хорошей причиной было бы, если бы вы хотели, чтобы они имели набор переменных окружения по умолчанию, но, поскольку /etc/profile
, вероятно, также недоступен на ранних этапах процесса загрузки, я не понимаю, как это может быть здесь.
Вместо этого используйте стандартный шаблон fork()/exec()
:
int system_alternative(const char* pgm, char *const argv[])
{
pid_t pid = fork();
if (pid > 0) {
// We're the parent, so wait for child to finish
int status;
waitpid(pid, &status, 0);
return status;
}
else if (pid == 0) {
// We're the child, so run the specified program. Our exit status will
// be that of the child program unless the execv() syscall fails.
return execv(pgm, argv);
}
else {
// Something horrible happened, like system out of memory
return -1;
}
}
Если вам нужно прочитать стандартный вывод из вызываемого процесса или отправить данные на его стандартный ввод, вам нужно будет выполнить некоторое перенаправление стандартного дескриптора через pipe()
или dup2()
.
Вы можете узнать все об этом в любой хорошей книге по Unix. Я рекомендую Расширенное программирование в среде UNIX от У. Ричарда Стивенса. Второе издание, соавтором которого является Rago, добавляет материал для платформ, появившихся после того, как Стивенс написал первое издание, таких как Linux и OS X, но основы, подобные этой, не изменились со времени первоначального выпуска.