2

您如何使用 C 来生成一个独立的子进程,它可以在不考虑父亲的情况下开展其业务?

我想产生几个进程,在它们创建后不久,它们会在完成工作之前休眠大约 2 分钟。

但是,我不希望父亲等到孩子完成,因为与此同时我想产生更多的进程。

我在Linux上。

4

3 回答 3

2

只需使用 生成尽可能多的进程fork(2),然后调用exit()父进程。孤儿将被收养init

于 2011-05-15T12:15:10.043 回答
2

使用叉子()。 fork() 系统调用

pid_t pid = fork (); 
if (pid < 0) 
  // Error
else if (pid == 0) 
  // Child Process
  // Sleep 2 min. ?!
else 
  // Code for Father
于 2011-05-15T12:18:02.903 回答
2

如果您想要创建多个子进程在创建后立即执行“自己的业务”,您应该使用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;
}
于 2011-05-15T13:25:59.013 回答