Как вы запускаете внешнюю программу и передаете ей параметры командной строки с помощью C? Если вам нужно использовать API операционной системы, включите решение для Windows, Mac и Linux.
Как вы создаете другой процесс в C?
Ответ 1
Это действительно зависит от того, что вы пытаетесь сделать именно так, как это:
- OS зависимый
- Не совсем понятно, что вы пытаетесь сделать.
Тем не менее, я постараюсь предоставить вам некоторую информацию.
В 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" печатается только один раз... с помощью parent.
execve()
, и его семейство функций почти всегда используется с fork().
execve()
и аналогичным образом перезаписывает текущий стекный фрейм с именем приложения, которое вы передаете ему. execve()
почти всегда используется с fork()
, где вы разыгрываете дочерний процесс, и если вы являетесь родителем, вы делаете все, что вам нужно, и если вы ребенок, вы выполняете новый процесс. execve()
также почти всегда используется с waitpid()
- waitpid принимает pid дочернего процесса и, буквально, ждет, пока ребенок не завершит работу и не вернет вам статус выхода ребенка.
Используя эту информацию, вы должны иметь возможность написать очень базовую оболочку; который принимает имена процессов в командной строке и запускает процессы, о которых вы говорите. Конечно, оболочки больше, чем входы и выходы, но вы должны быть в состоянии выполнить основы с помощью fork()
, execve()
и waitpid()
.
ПРИМЕЧАНИЕ. Это спецификация * nix! Это не будет работать в Windows.
Надеюсь, что это помогло.
Ответ 2
Если вы хотите выполнять более сложные операции, такие как чтение вывода внешней программы, вам может быть лучше обслуживаться popen системный вызов. Например, для программного доступа к списку каталогов (это несколько глупый пример, но полезный в качестве примера), вы могли бы написать что-то вроде этого:
#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
...
Ответ 3
#include <stdlib.h>
int main()
{
system("echo HAI");
return 0;
}
Ответ 4
Я хочу дать большое предупреждение не использовать систему, а 100% никогда не использовать систему при написании библиотеки. Он был разработан 30 лет назад, когда многопоточность была неизвестна операционной системе игрушек под названием Unix. И он по-прежнему не используется, даже когда почти все программы сегодня многопоточны.
Используйте popen или создайте fork + execvp, все остальное вам будет сложно найти проблемы с обработкой сигналов, сбоями в коде обработки среды и т.д. Это чистое зло и стыд, что выбранный и самый рейтинговый ответ способствует использованию "системы". Более здорово продвигать использование Cocain на рабочем месте.
Ответ 5
В 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);
Кроме того, вы можете даже убить дочерний процесс из материнского процесса, и поддерживать связь с ним через поток.
Ответ 6
Одним из решений является системная функция, определенная в stdlib.h
int system(const char *string);
Ответ 7
Если вам нужно проверить/прочитать/проанализировать вывод своей внешней команды, я бы предложил использовать popen() вместо system().
Ответ 8
Говоря о зависимых от платформы рецептах, в Windows используйте CreateProcess, на Posix (Linux, Mac) используйте fork
+ execvp
, Но system()
должен охватывать ваши основные потребности и является частью стандартной библиотеки.