system("command1");
system("command2");
Это примерно эквивалентно следующему:
{
const char* child_argv[] = { "command1", NULL };
pid_t pid = fork();
if (!pid) {
execvp(child_argv[0], child_argv);
exit(255); // errno should probably be sent to parent first.
}
waitpid(pid, NULL, 0);
}
{
const char* child_argv[] = { "command2", NULL };
pid_t pid = fork();
if (!pid) {
execvp(child_argv[0], child_argv);
exit(255); // errno should probably be sent to parent first.
}
waitpid(pid, NULL, 0);
}
В системе POSIX вы можете использовать spawn
вместо fork
.
{
const char* child_argv[] = { "command1", NULL };
pid_t pid;
posix_spawnp(&pid, child_argv[0], NULL, NULL, child_argv, environ);
waitpid(pid, NULL, 0);
}
{
const char* child_argv[] = { "command2", NULL };
pid_t pid;
posix_spawnp(&pid, child_argv[0], NULL, NULL, child_argv, environ);
waitpid(pid, NULL, 0);
}
Последние два решения избегают использования оболочки (что хорошо, если у вас есть имя файла или путь, а не команда оболочки).
Конечно, во всех трех фрагментах отсутствует проверка ошибок.