产生一个独立的孩子

你怎么能用C来产生一个独立的subprocess而不考虑父亲呢?

我想产卵几个过程,创造后不久,他们在工作之前睡觉大约2分钟。

不过,我不希望父亲等到孩子结束,因为在此期间我想要产生更多的stream程。

我在Linux上。

Solutions Collecting From Web of "产生一个独立的孩子"

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

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

只需使用fork(2)即可生成尽可能多的进程,然后在父进程中调用exit()init过程将采用孤儿。

如果你想创建多个子进程,创建它们的“自己的业务”,你应该使用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; }