Использование C для отправки exec-процесса в фоновом режиме?

Мой вопрос звучит так же, как этот, но это не так:

Запустите процесс в фоновом режиме в Linux с C

Я знаю, как сделать fork (), но не знаю, как отправить процесс в фоновый режим. Моя программа должна работать как простая командная оболочка Unix, которая поддерживает каналы и фоновые процессы. Я мог бы сделать трубу и вилку, но я не знаю, как отправить процесс на задний план с& как и последняя строка программы:

~>./a.out uname
SunOS
^C
my:~>./a.out uname &

Как добиться фонового процесса?

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define TIMEOUT (20)

int main(int argc, char *argv[])
{
  pid_t pid;

  if(argc > 1 && strncmp(argv[1], "-help", strlen(argv[1])) == 0)
    {
      fprintf(stderr, "Usage: Prog [CommandLineArgs]\n\nRunSafe takes as arguments:\nthe program to be run (Prog) and its command line arguments (CommandLineArgs) (if any)\n\nRunSafe will execute Prog with its command line arguments and\nterminate it and any remaining childprocesses after %d seconds\n", TIMEOUT);
      exit(0);
    }

  if((pid = fork()) == 0)        /* Fork off child */
    {
      execvp(argv[1], argv+1);
      fprintf(stderr,"Failed to execute: %s\n",argv[1]);
      perror("Reason");
      kill(getppid(),SIGKILL);   /* kill waiting parent */
      exit(errno);               /* execvp failed, no child - exit immediately */
    }
  else if(pid != -1)
    {
      sleep(TIMEOUT);
      if(kill(0,0) == 0)         /* are there processes left? */
    {
      fprintf(stderr,"\Attempting to kill remaining (child) processes\n");
      kill(0, SIGKILL);      /* send SIGKILL to all child processes */
    }
    }
  else
    {
      fprintf(stderr,"Failed to fork off child process\n");
      perror("Reason");
    }
}

Решение на простом английском языке, кажется, здесь: Как выполнить exec () процесс в фоновом режиме в C?

Catch SIGCHLD and in the the handler, call wait().

Я на правильном пути?

 paulsm411 июн. 2012 г., 21:10
Еще одна ссылка:How to Daemonize in Linux
 paulsm411 июн. 2012 г., 20:49
PS: Вот отличный пример обработчика SIG_CHLD, из самого превосходногоBeej's Guide to Network Programming, Он использует sigaction () и waitpid (), а основная программа выполняет другую полезную работу (ожидание новых подключений) в дополнение к обработке SIGCHLD.

Ответы на вопрос(1)

Решение Вопроса

A: В общем, именно то, что вы уже делаете: fork () / exec ().

В. Что не работает, как вы ожидаете?

Я подозреваю, что, возможно, вы также хотите "nohup" (чтобы полностью отделить ребенка от родителя).

Ключом к этому является запуск & quot; setsid () & quot; в дочернем процессе:

How to use fork() to daemonize a child process independant of it's parent?

http://www.enderunix.org/docs/eng/daemon.php

 Niklas Rosencrantz26 июн. 2012 г., 10:38
Это действительно интересно, спасибо за информацию и ссылки.

Ваш ответ на вопрос