FACT++  1.0
dim_fork.cxx
Go to the documentation of this file.
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);
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 */
static pid_t fork_em()
Definition: dim_fork.cxx:17
void handle_cmd(void *tag, void *data, int *size)
Definition: dim_fork.cxx:12
int main(int, char **)
Definition: dim_fork.cxx:44
static int id
Definition: dim_fork.cxx:9
void dim_init()
Definition: dim_thr.c:111
#define dis_start_serving
Definition: dis.h:8
#define dis_stop_serving
Definition: dis.h:9
static int run
Definition: dim_fork.cxx:9
int size
Definition: db_dim_server.c:17
float data[4 *1440]
static int doForkNow
Definition: dim_fork.cxx:10
#define dis_add_service
Definition: dis.h:12
static int id_cmd
Definition: dim_fork.cxx:9