Как выполнить exec() в фоновом режиме в C?

Я сделал fork и exec() для процесса, но я хотел бы запустить его в фоновом режиме. Как я могу это сделать? Я просто могу избежать вызова waitpid на нем, но тогда процесс сидит там навсегда, ожидая возвращения его статуса родительскому. Есть ли другой способ сделать это?

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