1 | #include <cerrno>
|
---|
2 | #include <cstdio>
|
---|
3 | #include <unistd.h>
|
---|
4 | #include <sys/wait.h>
|
---|
5 | extern "C" {
|
---|
6 | #include "dis.hxx"
|
---|
7 | }
|
---|
8 |
|
---|
9 | static int id, id_cmd, run = 0;
|
---|
10 | static int doForkNow = 0;
|
---|
11 |
|
---|
12 | void handle_cmd(void *tag, void *data, int *size)
|
---|
13 | {
|
---|
14 | doForkNow = 1;
|
---|
15 | }
|
---|
16 |
|
---|
17 | static pid_t fork_em() {
|
---|
18 | // ::dis_remove_service(id);
|
---|
19 | ::dis_stop_serving();
|
---|
20 | ::printf("Sleep a bit to see task disappear in did\n");
|
---|
21 | //::sleep(3);
|
---|
22 | pid_t pid = ::fork();
|
---|
23 | if ( pid == 0 ) {
|
---|
24 | ::dim_init();
|
---|
25 | ::printf("PID:%d Register Child service Child/run to DNS....\n",::getpid());
|
---|
26 | id = ::dis_add_service((char*)"Child/run",(char*)"I",&run,sizeof(run),0,0);
|
---|
27 | ::dis_start_serving((char*)"Child");
|
---|
28 | }
|
---|
29 | else if ( pid > 0 ) {
|
---|
30 | ::dim_init();
|
---|
31 | //::sleep(3);
|
---|
32 | ::printf("PID:%d RE-Register Parent to DNS....\n",::getpid());
|
---|
33 | id = ::dis_add_service((char*)"Parent/run",(char*)"I",&run,sizeof(run),0,0);
|
---|
34 | // id_cmd = :: dis_add_cmnd((char *)"Parent/cmd",(char*)"C",handle_cmd,0);
|
---|
35 | ::dis_start_serving((char*)"Parent");
|
---|
36 | }
|
---|
37 | else {
|
---|
38 | ::printf("ERROR in fork!!!! %s\n",strerror(errno));
|
---|
39 | ::exit(0);
|
---|
40 | }
|
---|
41 | return pid;
|
---|
42 | }
|
---|
43 |
|
---|
44 | int main(int /* argc */, char** /* argv */) {
|
---|
45 | id = ::dis_add_service((char*)"Parent/run",(char*)"I",&run,sizeof(run),0,0);
|
---|
46 | // id_cmd = :: dis_add_cmnd((char *)"Parent/cmd",(char*)"C",handle_cmd,0);
|
---|
47 | ::dis_start_serving((char*)"Parent");
|
---|
48 | ::sleep(5);
|
---|
49 | pid_t child = 0;
|
---|
50 |
|
---|
51 | Again:
|
---|
52 | child = fork_em();
|
---|
53 | if ( child > 0 ) {
|
---|
54 | int status;
|
---|
55 | sleep(5);
|
---|
56 | kill(child,SIGTERM);
|
---|
57 | wait(&status);
|
---|
58 | sleep(1);
|
---|
59 | goto Again;
|
---|
60 | }
|
---|
61 |
|
---|
62 | while(1)
|
---|
63 | {
|
---|
64 | /*
|
---|
65 | if(doForkNow)
|
---|
66 | {
|
---|
67 | int status;
|
---|
68 | doForkNow = 0;
|
---|
69 | if(child > 0)
|
---|
70 | {
|
---|
71 | kill(child,SIGTERM);
|
---|
72 | wait(&status);
|
---|
73 | sleep(1);
|
---|
74 | }
|
---|
75 | child = fork_em();
|
---|
76 | }
|
---|
77 | */
|
---|
78 | ::sleep(1);
|
---|
79 | }
|
---|
80 | return 1;
|
---|
81 | }
|
---|
82 |
|
---|
83 |
|
---|
84 | /*
|
---|
85 |
|
---|
86 | g++ -o dim_fork -I../../DIM/dim -ldim -lrt -pthread ../test/dim_fork.cpp
|
---|
87 |
|
---|
88 | [frankm@plus04 cmt]$ ./dim_fork
|
---|
89 | PID:20407 Register Child to DNS....
|
---|
90 | PID 20407 - Fri Dec 3 22:01:57 2010 - (FATAL) Child: Some Services already known to DNS
|
---|
91 | PID:20404 RE-Register Parent to DNS....
|
---|
92 |
|
---|
93 | */
|
---|