Порождает независимого ребенка - PullRequest
2 голосов
/ 15 мая 2011

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

Я хочу порождать несколько процессов, и вскоре после их создания они засыпают примерно на 2 минуты, прежде чем они сделают свою работу.

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

Я в Linux.

Ответы [ 3 ]

2 голосов
/ 15 мая 2011

Если вы хотите создать несколько дочерних процессов, занимающихся «своим делом» сразу после их создания, вы должны использовать vfork() (используется для создания новых процессов без полного копирования адресного пространства родительского процесса) и exec() семья, чтобы заменить изображения детей обрабатывает все, что вы хотите.

если вы не хотите, чтобы отец ждал, пока ребенок закончит, вы должны воспользоваться асинхронной обработкой сигналов. SIGCHLD отправляется после завершения дочернего процесса. Таким образом, вы можете поместить wait() в обработчике сигналов для SIGCHLD, а не в родительский процесс, и позволить обработчику сигналов собирать статус возврата для дочернего процесса.

Ниже приведен пример с игрушкой:

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

sig_atomic_t child_process_ret_status;

void spawn(char *program,char *argv[]){
    pid_t child_pid=vfork();

    if(child_pid>0){
        printf("the parent process pid: %d\n",(int)getpid());
        printf("the cpid: %d\n",(int)child_pid);
        system("ping -c 10 www.google.com");
    }else{
        printf("the new process %d is going to execute the new program %s\n",(int)getpid(),program);
        execvp(program,argv);
        printf("you'll never see this if everything goes well.\n");
    }
}


void child_process_ret_handle(int sigval){
    if(sigval == SIGCHLD){
        printf("SIGCHLD received !\n");
        wait(&child_process_ret_status);
    }
}

int main(void){
    signal(SIGCHLD,child_process_ret_handle);
    char *program="sleep";
    char *argv[]={
        "sleep",
        "5",
        NULL
    };

    spawn(program,argv);
    if(WIFEXITED (child_process_ret_status)){
        printf("child process exited successfully with %d\n",WEXITSTATUS (child_process_ret_status));
    }else{
        printf("the child process exited abnormally\n");    
    }

    printf("parent process: %d returned!\n",getpid());
    return 0;
}
2 голосов
/ 15 мая 2011

Просто создайте столько процессов, сколько вам нужно, используя fork(2), затем вызовите exit() в родительском процессе.Дети-сироты будут усыновлены по процессу init.

1 голос
/ 15 мая 2011

Используйте fork (). Системный вызов fork ()

pid_t pid = fork (); 
if (pid < 0) 
  // Error
else if (pid == 0) 
  // Child Process
  // Sleep 2 min. ?!
else 
  // Code for Father
...