📄 mserver_sys_check.c
字号:
#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include<sys/stat.h>#include<sys/time.h>//setpriority#include<sys/resource.h>//setpriority#include<signal.h>#include <stdio.h>#include <unistd.h>#include<stdlib.h>#include<fcntl.h>#include<errno.h>#include<time.h>#include"socket.h"#include"M_check_Mstate_bk.h"#include"M_check_Astate_bk.h"#include"M_check_Bstate_bk.h"#include"sys_check.h"#include"server_cmd.h"#include"write_log.h"#include"liansuo_count.h"#include"print.h"#define STATE_FILE "/zlm/state.log"#define OBFILE "/proc/stat"#define LEN 16348#define NUM 6 #define FALSE 0#define TRUE 1int Okay;void sig_child() { signal(SIGCHLD, sig_child); Okay = FALSE; } main(void){ /* semaphores */// struct sembuf buf_sem;#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) /* union semun is defined by including <sys/sem.h> */#else /* otherwise, according to X/OPEN we have to define it ourselves */ union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ };#endif union semun un; int flag = (IPC_CREAT | IPC_EXCL | 0660); int size = sizeof(struct area); key_t skey = 0x04030203; /* sample keys */ key_t mkey = 0x01020333;// int semid; /* semaphore id */// int shmid; /* shared memory id */ int pid_Sys_check; /* Sys_check_state process child task pid */ int pid_server_cmd; /*Mserver_cmd process child task pid */ int pids[NUM]; int i; int pid; char inbuf[80]; /* get a shared memory area */ shmid=shmget(mkey, size, flag); /* attach the shared memory area */ ap=(struct area *)shmat(shmid, 0, 0); /* initialize account info in shared memory */ ap->Mstate_gl=1; ap->Astate_gl=1; ap->Bstate_gl=1; ap->Amain_server_gl=1; ap->Bmain_server_gl=1; ap->Sys_main_cpu_gl=1; ap->Sys_main_hub_gl=1; ap->Amain_port_gl=8000; ap->Bmain_port_gl=8000; ap->Mhost_name_gl="192.168.1.1"; ap->Ahost_name_gl="192.168.1.3"; ap->Bhost_name_gl="192.168.1.5"; ap->flag_server_cmd=0; ap->flag_Sys_check=0; /* get and initialize a semaphore */ semid=semget(skey, 1, flag); /* set semaphore available */ un.val=1; semctl(semid, 0, SETVAL, un); /* first and only semaphore */ buf_sem.sem_num=0; /* wait if set */ buf_sem.sem_flg=0; /* setup SIGCHLD handler */ signal(SIGCHLD, sig_child);if((pids[0]=fork())==0)/*Mserver_A_getdata*/ { char *argv[]={"Mserver_A_getdata",(char *)0}; printf("\tMserver_A_getdata is started up pid= %d\n",getpid()); //setpriority(PRIO_PROCESS,pids[0],-10); execv("/zlm/Mserver_A_getdata",argv); }if((pids[1]=fork())==0)/*Mserver_A_getdata_bk*/ { char *argv[]={"Mserver_A_getdata_bk",(char *)0}; printf("\tMserver_A_getdata_bk is started up pid= %d\n",getpid()); execv("/zlm/Mserver_A_getdata_bk",argv); }if((pids[2]=fork())==0)/*Mserver_B_gtdata*/ { char *argv[]={"Mserver_B_getdata",(char *)0}; printf("\tMserver_B_getdata is started up pid= %d\n",getpid()); execv("/zlm/Mserver_B_getdata",argv); }if((pids[3]=fork())==0)/*Mserver_B_gtdata_bk*/ { char *argv[]={"Mserver_B_getdata_bk",(char *)0}; printf("\tMserver_B_getdata_bk is started up pid= %d\n",getpid()); execv("/zlm/Mserver_B_getdata_bk",argv); }if((pids[4]=fork())==0) /* Sys_check_state */ { printf("\tSys_check_state is started up pid= %d\n",getpid()); printf("\tFind the state_information in the file '/zlm/state.log'.\n"); sys_check(); }if((pids[5]=fork())==0) /*Mserver_cmd*/ { printf("\tMserver_cmd is started up pid= %d\n",getpid()); server_cmd(); }//ifwhile(1){ Okay=TRUE; while(Okay) /* pause */ usleep(1); pid=wait(NULL); /* exiting pid */ for(i=0;i<NUM;i++) { if(pid==pids[i]) break; } printf("\tSubtask #%d ended, pid = %d\n", i, pids[i]); switch(i) { case 0: { if((pids[0]=fork())==0)/*Mserver_A_getdata*/ { char *argv[]={"Mserver_A_getdata",(char *)0}; printf("\nMserver_A_getdata is restarted up pid= %d\n",getpid()); //setpriority(PRIO_PROCESS,pids[0],-10); execv("/zlm/Mserver_A_getdata",argv); } break; } case 1: { if((pids[1]=fork())==0)/*Mserver_A_getdata_bk*/ { char *argv[]={"Mserver_A_getdata_bk",(char *)0}; printf("\tMserver_A_getdata_bk is restarted up pid= %d\n",getpid()); execv("/zlm/Mserver_A_getdata_bk",argv); } break; } case 2: { if((pids[2]=fork())==0)/*Mserver_B_gtdata*/ { char *argv[]={"Mserver_B_getdata",(char *)0}; printf("\tMserver_B_getdata is restarted up pid= %d\n",getpid()); execv("/zlm/Mserver_B_getdata",argv); } break; } case 3: { if((pids[3]=fork())==0)/*Mserver_B_gtdata_bk*/ { char *argv[]={"Mserver_B_getdata_bk",(char *)0}; printf("\tMserver_B_getdata_bk is restarted up pid= %d\n",getpid()); execv("/zlm/Mserver_B_getdata_bk",argv); } break; } case 4: { if((pids[4]=fork())==0) /* Sys_check_state */ { printf("\tSys_check_state is restarted up pid= %d\n",getpid()); sys_check(); } break; } case 5: { if((pids[5]=fork())==0) /*Mserver_cmd*/ { // set semaphore buf_sem.sem_op=-1; semop(semid, (struct sembuf *) &buf_sem, 1); ap->flag_server_cmd=0; // clear semaphore buf_sem.sem_op=1; semop(semid, (struct sembuf *) &buf_sem, 1); printf("\tMserver_cmd is restarted up pid= %d\n",getpid()); server_cmd(); } break; } }//switch}//while(1) //waitpid(pid_Sys_check); /* remove shared memory, semaphore, and exit */ shmctl(shmid, IPC_RMID, (struct shmid_ds *) 0); semctl(semid, 0, IPC_RMID, un); return;}//main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -