Использование 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().
Я на правильном пути?