1. 程式人生 > >多進程失敗拉起的demo

多進程失敗拉起的demo

() print pre %d string style pan true code

 1 #include <iostream>
 2 #include <vector>
 3 #include <unistd.h>
 4 #include <stdlib.h>
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <signal.h>
 8 #include <sys/wait.h>
 9 #include <errno.h>
10 
11 void RunChild(int idx) {
12     for
(int i = 0; i < 10; i++) { 13 printf("worker %d %d\n", getpid(), idx); 14 sleep(1); 15 } 16 } 17 18 int main() { 19 int worker_cnt = 10; 20 std::vector<int> worker_pids(worker_cnt); 21 for (int i = 0; i < worker_cnt; i++) { 22 int pid = fork(); 23 if
(pid != 0) { 24 //no process < 0 ? 25 worker_pids[i] = pid; 26 continue; 27 } 28 29 RunChild(i); 30 exit(0); 31 } 32 33 //avoid some unkown action for SIGCHLD 34 signal(SIGCHLD, SIG_DFL); 35 while (true) { 36 //1.get exit child
37 //2.get worker by pid 38 //3.fork it 39 //4.child run 40 41 //1.get exit child 42 int pid = -1; 43 while((pid = wait(NULL)) == -1) { 44 if (errno == EINTR) { 45 printf("wait pid err %d %s\n", errno, strerror(errno)); 46 continue; 47 } 48 else { 49 break; 50 } 51 } 52 if(pid == -1) { 53 printf("wait pid err %d %s\n", errno, strerror(errno)); 54 //sleep( 1 ); 55 continue; 56 } 57 printf("wait pid %d\n", pid); 58 59 //2.get worker by pid 60 int worker_id = -1; 61 for (int i = 0; i < worker_cnt; i++) { 62 if (worker_pids[i] == pid) { 63 worker_id = i; 64 break; 65 } 66 } 67 printf("worker pid %d id %d exit\n", pid, worker_id); 68 if( worker_id == -1 ) { 69 printf("master wait pid %d not worker\n", pid); 70 continue; 71 } 72 73 //3.fork it 74 usleep(100000); 75 pid = fork(); 76 if (pid != 0) { 77 // no process pid < 0 ? 78 printf("%s new worker id %d\n", __func__, pid); 79 worker_pids[worker_id] = pid; 80 continue; 81 } 82 83 //4.child run 84 RunChild(worker_id); 85 exit(0); 86 } 87 return 0; 88 }

多進程失敗拉起的demo