Я сделал fork и exec() для процесса, но я хотел бы запустить его в фоновом режиме. Как я могу это сделать? Я просто могу избежать вызова waitpid на нем, но тогда процесс сидит там навсегда, ожидая возвращения его статуса родительскому. Есть ли другой способ сделать это?
Как выполнить exec() в фоновом режиме в C?
Ответ 1
Поймайте SIGCHLD и в обработчике вызовите wait().
Некоторые вкусы Posix (я думаю, BSD, но не цитирую меня), если вы проигнорируете SIGCHLD, ядро автоматически очистит процесс зомби (это то, что вы видите в ps). Это приятная функция, но не переносная.
Ответ 2
Я думаю, что вы пытаетесь создать процесс демона. Прочитайте эту ссылку в Википедии для объяснения.
Примером (от Steven Advanced Programming в среде Unix) для создания процесса является демон:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int daemon_int(void)
{
pid_t pid;
if ((pid = fork()) < 0)
return (-1) ;
else if (pid != 0)
exit(0) ; /* The parent process exits */
setsid() ; /* become session leader */
chdir("/") ; /* change the working dir */
umask(0) ; /* clear out the file mode creation mask */
return(0) ;
}
Конечно, это предполагает Unix как OS.
Итак, ваша программа включает указанную выше функцию и вызывает ее, как только она запускается. Затем он отключается от него родительского процесса и будет продолжать работать до тех пор, пока он не завершится или не будет убит.
Ответ 3
waitpid(-1, &status, WNOHANG)
может сделать то, что вам нужно: он должен немедленно вернуться, если дочерний процесс не завершился. В качестве альтернативы вы можете прослушивать сигнал SIGCHLD.
Ответ 4
Форк для создания фонового потока, а затем exec. См. Вопрос об ошибке на этом сайте: Можно ли запустить фоновый процесс, используя команду exec() и как аргумент?