Можем ли мы запустить фоновый процесс, используя exec() в качестве аргумента?

Если нет, то как мы можем запустить фоновый процесс в C?


person Community    schedule 02.10.2009    source источник


Ответы (3)


В Unix exec() — это только часть истории.

exec() используется для запуска нового двоичного файла в текущем процессе. Это означает, что двоичный файл, который в данный момент выполняется в текущем процессе, больше не будет выполняться.

Итак, прежде чем вызывать exec(), вы хотите вызвать fork(), чтобы создать новый процесс, чтобы ваш текущий двоичный файл мог продолжать работать.

Обычно, чтобы текущий двоичный файл ожидал завершения нового процесса, вы вызываете одну из функций семейства wait*(). Эта функция переводит текущий процесс в спящий режим до тех пор, пока процесс, который вы ожидаете, не завершится.

Таким образом, чтобы создать «фоновый» процесс, ваш текущий процесс должен просто пропустить вызов ожидания.

person R Samuel Klatchko    schedule 02.10.2009
comment
Будьте осторожны, это создает зомби-процесс. - person Sw0ut; 27.08.2018
comment
Предлагаю создать ветку, потом в ветке можно разветвиться и ждать ребенка. - person Sw0ut; 27.08.2018
comment
@Sw0ut - нить - очень дорогой способ предотвратить появление зомби. Стандартная рекомендация — поймать SIGCHLD, а затем вызвать ожидание в обработчике сигнала. - person R Samuel Klatchko; 28.08.2018
comment
@Samuel Klatchko Мне абсолютно необходим поток в моей программе, потому что 1. Он должен быть асинхронным (я просто хочу запустить программу в фоновом режиме) 2. Я запускаю эту дочернюю программу много раз, что приводит к большому количеству зомби (около 6000 за 1 час, если не останавливаться). С SIGCHLD это не сработало, как ожидалось, казалось, ждало конца дочерней программы, возможно, потому что она выполнялась в основном потоке. - person Sw0ut; 28.08.2018

Используйте вызов fork() для создания нового процесса, затем exec() для загрузки программы в этот процесс. См. справочные страницы (man 2 fork, man 2 exec) для получения дополнительной информации.

person unwind    schedule 02.10.2009
comment
fork и exec не имеют ничего общего с фоновым процессом - person avd; 02.10.2009
comment
@aditya: Не могли бы вы рассказать об этом подробнее? fork() - это то, как создать новый процесс, что вам нужно сделать, если вы хотите запустить что-то в фоновом режиме из программы C... - person unwind; 02.10.2009
comment
Форк @aditya ровно на 100% связан с созданием фонового процесса. О чем ты говоришь? - person Carl Norum; 03.10.2009

Fork возвращает PID дочернего элемента, поэтому общая идиома:

if(fork() == 0)
    // I'm the child
    exec(...)
person Kevin Peterson    schedule 02.10.2009