Сведения о вопросе

Fhohir

08:21, 20th August, 2020

Теги

c   process    

Как вы создаете другой процесс в C?

Просмотров: 371   Ответов: 8

Как запустить внешнюю программу и передать ей параметры командной строки с помощью C? Если вам необходимо использовать операционную систему API, включите решение для Windows, Mac и Linux.



  Сведения об ответе

FAriza

12:11, 25th August, 2020

Это действительно зависит от того, что вы пытаетесь сделать, именно так, как это:

  1. OS зависимый
  2. Не совсем понятно, что ты пытаешься сделать.

Тем не менее, я постараюсь предоставить вам некоторую информацию для принятия решения.
На 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.

Надеюсь, это помогло.


  Сведения об ответе

ЯЯ__4

11:36, 26th August, 2020

Если вы хотите выполнять более сложные операции, такие как чтение выходных данных внешней программы, вам может быть лучше обслужен системный вызов 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
...


  Сведения об ответе

dump

14:53, 1st August, 2020

#include <stdlib.h>

int main()
{
    system("echo HAI");

    return 0;
}


  Сведения об ответе

SILA

01:05, 15th August, 2020

Я хочу дать большое предупреждение, чтобы не использовать system и 100% никогда не использовать system, когда вы пишете библиотеку. Он был разработан 30 лет назад, когда многопоточность была неизвестна игрушечной операционной системе под названием Unix. И это все еще не пригодно для использования, даже когда почти все программы Сегодня многопоточны.

Использовать к popen или сделать fork+execvp, все остальное даст вам трудно найти проблемы с обработкой сигнала, вылетает в среде код обработки и т. д. Это чистое зло и позор, что выбранный и самый рейтинговый ответ способствует использованию "system". Более полезно пропагандировать использование кокаина на рабочем месте.


  Сведения об ответе

LIZA

11:54, 7th August, 2020

На 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);

И за дополнительную плату вы можете даже убить процесс ребенка от процесса матери, и поддерживайте с ним связь через поток.


  Сведения об ответе

ЯЯ__4

09:19, 2nd August, 2020

Одним из решений является системная функция, определенная в stdlib.h

int system(const char *string);

пример системы api


  Сведения об ответе

#hash

18:40, 11th August, 2020

Если вам нужно check/read/parse вывод вашей внешней команды, я бы предложил использовать popen() вместо system().


  Сведения об ответе

piter

08:37, 2nd August, 2020

Говоря о зависящих от платформы рецептах, на Windows используйте CreateProcess, на Posix (Linux, Mac) используйте fork + execvp . Но system() должен покрывать ваши основные потребности и является частью стандартной библиотеки.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться