libc
имеет функции system
и popen
, которые работают примерно так:
int system(cont char *command) {
const char *argv[4] = {"/bin/sh", "-c", command};
int status;
pid_t child = fork();
if (child == 0) {
execve(argv[0], argv, NULL);
exit(-1);
}
waitpid(child, &status, 0);
return status;
}
FILE *popen(const char *command, const char *type) {
int fds[2];
const char *argv[4] = {"/bin/sh", "-c", command};
pipe(fds);
if (fork() == 0) {
close(fds[0]);
dup2(type[0] == 'r' ? 0 : 1, fds[1]);
close(fds[1]);
execve(argv[0], argv, NULL);
exit(-1);
}
close(fds[1]);
return fdopen(fds[0], type);
}
(кроме случаев проверки ошибок и прочего)
Если вам нужен более точный контроль над обработкой аргументов (вместо того, чтобы проходить через sh
), или вы хотите контролировать более одного из {stdin, stdout, stderr}
, вам придется написать его самостоятельно или найти библиотеку. Но стандартная библиотека охватывает большинство случаев использования.