| 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 | */
|
|---|