




#include <stdlib.h>
int main()
{
system("echo HAI");
return 0;
}
Никогда не используйте систему. Это далеко не безопасно для многопоточности, оно сильно укусит вас там, где действительно больно. Ошибки обработки сигналов, например, являются одними из самых неприятных проблем, и "система" полна ими.
Одним из решений является системная функция, определенная в stdlib.h
int system(const char *string);
В UNIX, я думаю, вам в основном нужно форкнуть его, если вы хотите, чтобы порожденный процесс запускался отдельно от вашего порождающего: например, если вы не хотите, чтобы ваш порожденный процесс завершался, когда вы выходите из процесса порождения.
Страница Вот, которая объясняет все тонкие различия между Fork, System, Exec.
Если вы работаете с Win, Mac и Linux, я могу порекомендовать вам Qt Framework и его объект QProcess, но я не знаю, подходит ли вам этот вариант. Большим преимуществом является то, что вы сможете скомпилировать один и тот же код на windows linux и mac:
QString program = "./yourspawnedprogram";
QProcess * spawnedProcess = new QProcess(parent);
spawnedProcess->start(program);
// or spawnedProcess->startDetached(program);
И за дополнительную плату вы даже можете убить дочерний процесс из материнского процесса, и поддерживать с ним связь через поток.
Если вы хотите выполнять более сложные операции, такие как чтение вывода внешней программы, вам может быть лучше подойдет системный вызов открывать. Например, чтобы программно получить доступ к списку каталогов (это несколько глупый пример, но полезный пример в качестве), вы можете написать что-то вроде этого:
#include <stdio.h>
int main()
{
int entry = 1;
char line[200];
FILE* output = popen("/usr/bin/ls -1 /usr/man", "r");
while ( fgets(line, 199, output) )
{
printf("%5d: %s", entry++, line);
}
}
чтобы дать такой результат
1: cat1
2: cat1b
3: cat1c
4: cat1f
5: cat1m
6: cat1s
...
if (!feof(output)) return -1; pclose(output); return 0; (нет pclose(output), если !feof(output) согласно пример от Microsoft.)
Это действительно зависит от того, что вы пытаетесь сделать, а именно:
Тем не менее, я постараюсь предоставить вам определенную информацию.
В UNIX fork() создает клон вашего процесса из того места, где вы вызвали fork. Имеется в виду, если у меня есть следующий процесс:
#include <unistd.h>
#include <stdio.h>
int main()
{
printf( "hi 2 u\n" );
int mypid = fork();
if ( 0 == mypid )
printf( "lol child\n" );
else
printf( "lol parent\n" );
return( 0 );
}
Результат будет выглядеть следующим образом:
hi 2 u
lol child
lol parent
Когда вы используете fork(), pid, возвращаемый в дочернем элементе, равен 0, а pid, возвращаемый в родительском элементе, является pid ребенка. Обратите внимание, что "hi2u" печатается только один раз ... родитель.
execve() и его семейство функций почти всегда используются с fork().execve() и т.п. перезаписывают текущий стековый фрейм именем приложения, которое вы ему передаете. execve() почти всегда используется с fork(), где вы разворачиваете дочерний процесс, и если вы родитель, вы делаете все, что вам нужно, и если вы ребенок, вы запускаете новый процесс. execve() также почти всегда используется с waitpid() - waitpid принимает pid дочернего процесса и, буквально, ждет, пока дочерний процесс не завершится и не вернет вам статус выхода дочернего процесса.
Используя эту информацию, вы сможете написать очень простую оболочку; тот, который принимает имена процессов в командной строке и запускает процессы, которые вы ему указываете. Конечно, оболочки делают больше, например ввод и вывод по конвейеру, но вы должны уметь выполнять основы с помощью fork(), execve() и waitpid().
ПРИМЕЧАНИЕ. Это зависит от * nix! Это НЕ будет работать в Windows.
Надеюсь, это помогло.
Если вам нужно проверить / прочитать / проанализировать вывод вашей внешней команды, я бы предложил использовать popen () вместо system ().
Говоря о платформенно-зависимых рецептах, в Windows используйте CreateProcess, в Posix (Linux, Mac) используйте fork + execvp. Но system() должен удовлетворять ваши основные потребности и является частью стандартной библиотеки.
Я хочу сделать большое предупреждение не использовать систему и 100% никогда не использовать систему при написании библиотеки. Он был разработан 30 лет назад, когда многопоточность была неизвестна игрушечной операционной системе Unix. И он по-прежнему непригоден, даже когда сегодня почти все программы являются многопоточными.
Используйте popen или выполните fork + execvp, все остальное поможет вам найти проблемы с обработкой сигналов, сбои в коде обработки среды и т. д. Это чистое зло и позор, что выбранный и наиболее оцененный ответ продвигает использование "системы" ". Более полезно продвигать употребление кокаина на рабочем месте.
Я думаю, вам нужно переписать свой вопрос - открытие внешнего процесса - это не точно, то же самое, что запуск другого процесса ... есть разница.