Если вы хотите создать несколько дочерних процессов, занимающихся «своим делом» сразу после их создания, вы должны использовать 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;
}