Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как вы создаете другой процесс в C?
Как запустить внешнюю программу и передать ей параметры командной строки с помощью C? Если вам необходимо использовать операционную систему API, включите решение для Windows, Mac и Linux.
Это действительно зависит от того, что вы пытаетесь сделать, именно так, как это:
- 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 );
}
Вывод будет выглядеть следующим образом:
привет 2 u
лол ребенок
лол родитель
Когда вы fork() пид вернулся в ребенка-это 0, а пид возвратился в родитель пид ребенка. Обратите внимание, что "hi2u" печатается только один раз... со стороны родителя .
execve() и его семейство функций почти всегда используются с fork(). execve() и тому подобное перезаписывают текущий stackframe именем приложения, которое вы передаете ему. execve() почти всегда используется с fork() , где вы fork дочерний процесс, и если вы родитель, вы делаете все, что вам нужно, чтобы продолжать делать, и если вы ребенок, вы запускаете новый процесс. execve() также почти всегда используется с waitpid() -- waitpid принимает pid дочернего процесса и, в буквальном смысле, ждет , пока дочерний процесс завершится и вернет вам статус выхода ребенка.
Используя эту информацию, вы должны быть в состоянии написать очень простой shell; тот, который принимает имена процессов в командной строке и запускает процессы, которые вы ему указываете. Конечно, оболочки делают больше, чем это, например, ввод и вывод трубопроводов, но вы должны быть в состоянии выполнить основы, используя fork(), execve() и waitpid() .
NOTE: это *nix конкретно! Это будет NOT работать на Windows.
Надеюсь, это помогло.
Если вы хотите выполнять более сложные операции, такие как чтение выходных данных внешней программы, вам может быть лучше обслужен системный вызов 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
...
Я хочу дать большое предупреждение, чтобы не использовать system и 100% никогда не использовать system, когда вы пишете библиотеку. Он был разработан 30 лет назад, когда многопоточность была неизвестна игрушечной операционной системе под названием Unix. И это все еще не пригодно для использования, даже когда почти все программы Сегодня многопоточны.
Использовать к popen или сделать fork+execvp, все остальное даст вам трудно найти проблемы с обработкой сигнала, вылетает в среде код обработки и т. д. Это чистое зло и позор, что выбранный и самый рейтинговый ответ способствует использованию "system". Более полезно пропагандировать использование кокаина на рабочем месте.
На UNIX, я думаю, что вам в основном нужно fork его, если вы хотите, чтобы порожденный процесс выполнялся отдельно от вашего порождающего : например, если вы не хотите, чтобы ваш порожденный процесс был завершен, когда вы выходите из своего порождающего процесса.
Вот страница, которая объясняет все тонкие различия между Fork, System, Exec.
Если вы работаете на Win, Mac и linux , я могу порекомендовать Вам фреймворк Qt и его объект QProcess, но я не знаю, подходит ли вам этот вариант. Большим преимуществом является то, что вы сможете скомпилировать один и тот же код на windows linux и mac :
QString program = "./yourspawnedprogram";
QProcess * spawnedProcess = new QProcess(parent);
spawnedProcess->start(program);
// or spawnedProcess->startDetached(program);
И за дополнительную плату вы можете даже убить процесс ребенка от процесса матери, и поддерживайте с ним связь через поток.
Говоря о зависящих от платформы рецептах, на Windows используйте CreateProcess, на Posix (Linux, Mac) используйте fork + execvp . Но system() должен покрывать ваши основные потребности и является частью стандартной библиотеки.