您如何使用 C 来生成一个独立的子进程,它可以在不考虑父亲的情况下开展其业务?
我想产生几个进程,在它们创建后不久,它们会在完成工作之前休眠大约 2 分钟。
但是,我不希望父亲等到孩子完成,因为与此同时我想产生更多的进程。
我在Linux上。
只需使用 生成尽可能多的进程fork(2)
,然后调用exit()
父进程。孤儿将被收养init
。
使用叉子()。 fork() 系统调用
pid_t pid = fork ();
if (pid < 0)
// Error
else if (pid == 0)
// Child Process
// Sleep 2 min. ?!
else
// Code for Father
如果您想要创建多个子进程在创建后立即执行“自己的业务”,您应该使用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;
}