Как создать еще один процесс в C?

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

Я думаю, вам нужно переписать свой вопрос - открытие внешнего процесса - это не точно, то же самое, что запуск другого процесса ... есть разница.

Jason Bunting 20.08.2008 03:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
30
1
52 452
8

Ответы 8

#include <stdlib.h>

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

    return 0;
}

Никогда не используйте систему. Это далеко не безопасно для многопоточности, оно сильно укусит вас там, где действительно больно. Ошибки обработки сигналов, например, являются одними из самых неприятных проблем, и "система" полна ими.

Lothar 28.12.2012 22:29

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

int system(const char *string);

пример системного API

В 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.)

7vujy0f0hy 30.12.2018 12:29

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

  1. Зависит от ОС
  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 );
}

Результат будет выглядеть следующим образом:

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

Другие вопросы по теме

Тестирование разработчиков и командное тестирование QA - каково правильное разделение работы?
Кто-нибудь использует исполняемые требования?
Как убить все процессы Linux старше определенного возраста?
Родительский процесс завершается раньше дочернего, но все равно распечатывает данные из канала
Как записать сообщения Log.d из другого процесса того же приложения?
Когда пользовательский процесс заменяет страницу, находится ли виртуальный адрес страницы в пространстве пользователя или пространстве ядра?
Откройте видимое окно Cmd в Java
Ошибка при чтении файла, используемого двумя отдельными процессами Java
Elispprocess-send-string выдает неожиданную ошибку «процесс не запущен: прослушайте»
Мой код работает только с одним файлом изображения, остальные файлы изображений считываются и сохраняются, но мой код не затрагивает их. Мне нужно, чтобы мой код работал со всеми файлами изображений