Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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);

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

Ответ 7

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

Ответ 8

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