Как выполнить exec () процесс в фоновом режиме в C? - PullRequest
13 голосов
/ 24 октября 2009

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

Ответы [ 4 ]

6 голосов
/ 24 октября 2009

Перехватите SIGCHLD и в обработчике вызовите wait ().

Некоторые разновидности Posix (я думаю * BSD, но не цитируйте меня об этом), если вы игнорируете SIGCHLD, ядро ​​автоматически очистит процесс зомби (что вы видите в ps). Это хорошая функция, но не переносимая.

5 голосов
/ 24 октября 2009

Я думаю, что вы пытаетесь создать процесс демона. Прочитайте эту ссылку в Википедии для объяснения.

Пример (из Расширенного программирования Стивена в среде 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-подобную ОС.

Таким образом, ваша программа включает вышеуказанную функцию и вызывает ее, как только она запускается. Затем он отключается от родительского процесса и будет продолжать работать до тех пор, пока не завершится или не будет уничтожен.

0 голосов
/ 24 октября 2009

waitpid(-1, &status, WNOHANG) может делать то, что вам нужно: он должен немедленно вернуться, если не завершен дочерний процесс. Кроме того, вы можете прослушивать сигнал SIGCHLD.

0 голосов
/ 24 октября 2009

Форк для создания фонового потока и затем exec. См. Двойной вопрос на этом сайте: Можем ли мы запустить фоновый процесс, используя exec (), давая & в качестве аргумента?

...