Как сразу вернуться из разветвленного дочернего процесса в Linux?

Я не знаком с разработкой Linux C.

мой код:

....

if((pid=fork())==0){
  //child process
  //start a process, may be need to change execv to other call
  execv (workdir , args);
}else if (pid<0){
  ...
}else{
  ...
}

Что я хочу сделать, так это немедленно вернуться из запущенного нового процесса в дочернем процессе.

Потому что в текущей программе execv (workdir , args); не вернется. (Мне нужно запустить длительный процесс).

Что я хочу сделать, так это запустить этот длительный процесс и немедленно вернуться в мой код C, чтобы моя программа C могла завершиться.

Как я могу это сделать? Может быть, сделать мой новый дочерний процесс демоном, как это сделать с помощью вызова API?


person Ben Xu    schedule 18.05.2012    source источник


Ответы (1)


Что-то вроде этого:

close(0); open("/dev/null", 0);
close(1);

if(open("/dev/null", O_WRONLY) < 0) {
    perror("/dev/null");
    exit(1);
}

switch(pid = fork()) {
    case -1:
        perror(argv[0]);
        exit(1);
        break;
    case 0:
        fflush(stdout);
        close(2); dup(1);
        setpgrp();
        setsid();
        execv(argv[0], argv);
        execvp(argv[0], argv);
        perror(argv[0]);
        _exit(1);
        break;
    default:
        exit(0);
        break;
}

Разветвит и отсоединит процесс и выйдет. Это «демонизирует» программу.

person Keith    schedule 18.05.2012
comment
это там любой простой способ? В ракушке . когда я запускаю программу, например. Fire Fox. я набираю файрфокс. если я хочу, чтобы он работал в фоновом режиме, я набираю firefox &. есть ли аналогичный способ в коде c? - person Ben Xu; 18.05.2012
comment
Почему бы просто не предоставить сценарий запуска, написанный на bash? Это довольно распространено в линуксе. - person Axel; 18.05.2012
comment
это сложно.... мы в большой программе. эта программа является одной из программ, вызываемых из java. с помощью джини. и я запускаю firefox. firefox уже является оболочкой :( не в bash, потому что мне нужно делать много других вещей в c - person Ben Xu; 18.05.2012
comment
кто-нибудь может помочь объяснить это: setpgrp(); ИД(); execv(argv[0], argv); execvp(argv[0], argv); - person Ben Xu; 18.05.2012
comment
понять каждую справочную страницу после проверки, но все еще не могу понять, почему эта комбинация создает процесс демона. :( - person Ben Xu; 22.05.2012
comment
@BenXu Я предлагаю вам прочитать книги Стивена по продвинутому программированию Unix. Это очень поможет. - person Keith; 22.05.2012