码迷,mamicode.com
首页 > 系统相关 > 详细

多进程失败拉起的demo

时间:2018-10-19 16:02:01      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:%s   ids   not   new   null   get   clu   ring   process   

 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

标签:%s   ids   not   new   null   get   clu   ring   process   

原文地址:https://www.cnblogs.com/linyx/p/9816623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!