Pergunta

Não estou familiarizado com o desenvolvimento do Linux C.

meu código:

....

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{
  ...
}

O que eu quero fazer é retornar imediatamente do novo processo iniciado no processo filho.

Porque no programa atual, execv (workdir , args); não retornará.(Preciso iniciar um processo longo).

O que eu quero fazer é iniciar esse processo de longo prazo e retornar imediatamente no meu código C, para que meu programa C possa sair.

Como posso fazer isso?Talvez fazer com que meu novo processo filho iniciado seja um daemon, como fazer isso por chamada de API?

Foi útil?

Solução

Algo assim:

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;
}

Irá bifurcar e desanexar um processo e sair.Ele "daemoniza" o programa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top