⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isap_client.cpp.bak

📁 unix环境下的多进程方式应用程序编程示例应用
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <baseobj.h>
#include <samrtbpacket.h>
#include <samrtbdict.h>
#include <samdictdef.h>
#include <sampacketdef.h>
#include <get_dhcs.h>

#include <obsclientdef.h>
#include <obsclientconn.h>
#include <obsclientdb.h>
#include <sampacket.h>
#include <math.h>

#define global_num 20 //max process number  // add by mmx

pid_t  g_childpid = -1;
FILE * myfp;
char MyFileName[100];
long sj=0;
struct tm *mytime;


void handler(int sig)  //add by mmx
{int pid,stat;
 
  printf("Now global_num is %d\n",global_num);
  while((pid=waitpid(0,&stat,WNOHANG))>0)
	 {  global_num--;
	 	printf("子进程 %d 已经清除 , 返回值 %d \r\n",pid,stat);
}
}

int pc_live(char * appName)
{int js=0,bs=1;
char nr[500];
FILE * fp;
char cmd[500];
sprintf(cmd,"ps ax|grep %s",appName);

fp = popen (cmd,"r");
  if (fp == NULL)
    {
      printf("%s 无此文件\n",appName);
      return bs;
    }
  else 
  {
    while(fgets(nr,250,fp)!=NULL)
      {
       if(strstr(nr,"grep")==NULL)
           {js++;
          
           if(js>1)
             {
              bs=1;
              break;
             }
           }
       else 
           bs=0;
       }
     pclose(fp);
      return bs;
   }
}

//---- Added by zxk ----
int p_nanosleep(useconds_t useconds)
{
	struct timespec tmsp;
	//time_t		tv_sec;		/* seconds */
	//long		tv_nsec;	/* and nanoseconds */
	tmsp.tv_sec = floor(useconds / 1000000);
	tmsp.tv_nsec = (useconds % 1000000) * 1000;
	int ret = ::nanosleep(&tmsp, NULL);
	if(ret != 0)
	{
		printf("::nanosleep() failed, because : ");
		switch(errno)
		{
		case EINTR:
			printf("interrupted by a signal.\n"); break;
		case EINVAL:
			printf("argument are invalid.\n"); break;
		case ENOSYS:
			printf("not supported by system.\n"); break;
		}
	}
	return ret;
}
//------ END ------

//global debug variable
RUNMODE_t runmode;

int obscommand(int argc, char* argv[]);
int readDHCS(const char* cFileName,char* cUser,char* cPasswd,char* cHostString);
int readCfgInfo(const char* cCfgFile,OBSCfgInfo &obsclient);
int getReponsetResult(CSamPacket &response,long &result,long &errorCode,COBSClientDB &clientDB);
void usage(const char* appName);
int writePidFile(char* fileName,pid_t pid);
int deletePidFile(char* fileName);
extern "C" void getStopSignal(int s);
extern "C" void backJob(int s);

int main(int argc,char* argv[])
{
	signal(SIGINT,getStopSignal);
	signal(SIGTERM,backJob);
	signal(SIGSTOP,backJob);
	signal(SIGKILL,backJob);
	signal(SIGCHLD,handler); //add by mmx

       pid_t  pid; 
       pid_t  spid; 
       int    status;
#ifdef WIN32
    WORD	wVersionRequested;
	WSADATA	wsaData;
	wVersionRequested = MAKEWORD(2, 0);
	if(WSAStartup(wVersionRequested, &wsaData) != 0) {
		printf("Err: Cannot startup windows sockets\n");
		return -1;
	}
#else
#endif
        char argval;
        char* appName= *argv++; 
        if (pc_live(appName)==1)
           { 
           	printf("ERROR:  %s is existence!!!\n",appName);
                exit(2);
           }
        sprintf(MyFileName,"%s%s",appName,".log");
        if(argc != 2)
        {
          usage(appName);
          exit(-1);
        }
        argc--;
        while (argc) {
            if (**argv != '-') {
              exit(-1);
            }
            argval = *(*argv + 1);
            argc--;
            argv++;
            switch (argval) {
                case 'd':
                case 'D':
                  runmode = DEBUG_MODE;
                  break;
                case 'h':
                case 'H':
                  if (0 == argc) {
                     usage(appName);
                     exit(0);
                  }
                  argc--;
                  argv++;
                  break;
                case 'b':
                case 'B':
                  runmode = BACKGROUND_MODE;
                  break;
                default:
                  exit(-1);
            } 
        }

        pid=fork();
        if(pid==0)
        {
           if(runmode == BACKGROUND_MODE)
           {
             spid=setsid();
             writePidFile((char*) PIDFILE,spid);
           }
           pid=getpid(); 
           if (runmode == DEBUG_MODE)
           {
             printf("Msg:OBSCLIENT current pid:%d.\n",pid);
             writePidFile((char*) PIDFILE,pid);
           }
           obscommand(argc, argv);
        }

		g_childpid = pid;

        if(runmode == DEBUG_MODE)
          if(wait(&status) != pid)
            printf("Msg:Can't wait for child process:%d.\n",pid);
        //deletePidFile((char* ) PIDFILE);

#ifdef WIN32
	// Cleanup Winsock dlls
	WSACleanup();
#else
#endif

 return 0;

}

int obscommand(int argc,char* argv[])
{
  OBSCfgInfo clientCfg;
  COBSClientDB clientDB;
  CSamPacket sendPacket;
  CSamPacket recvPacket;
  CSamSClientConnection clientTcp;
  CSamRtbDict obsDict;  
  int nCode=OBSREQ;
  int nSubCode;
  char dbuser[128];
  char dbpasswd[128];
  char dbhost[128];
  char packetBuf[PACKETLEN];
  char *cRecvBuf=NULL;
  int nPacketLen;
  int nOcts;
  int nsendOcts;
  int nrecvOcts;
  long nresult;
  long nerrorcode;
  u_char nrespstatus;
  u_long sendpacketid=0;
  u_long recvpacketid=0;
  obsDict.setFileName((char*) DICTFILE);
  int child_pid;   //add by mmx
  int process_num ; ////add by mmx
  
  int DBStatus;
   
  signal(SIGINT,SIG_IGN);  
  signal(SIGTERM,SIG_IGN);  
  signal(SIGSTOP,SIG_IGN);  
  signal(SIGKILL,SIG_IGN);  
  if(obsDict.dict_init())
  {
    if (runmode == DEBUG_MODE)
      printf("Msg:Can't init dict.\n");
    return 0;	
  }
  else
    if (runmode == DEBUG_MODE)
      printf("Msg:Init data dictionary.\n");
  
  recvPacket.setDict((CSamRtbDict*) &obsDict);
  if(!readCfgInfo(CLIENTCFGFILE,clientCfg))
  {
    if (runmode == DEBUG_MODE)
      printf("Msg:Can't open client configure file %s.\n",CLIENTCFGFILE);
    return 0;
  }
  
  if(get_dhcs(dbuser,dbpasswd,dbhost,(char*) DBCONNFILE))
  {
    if (runmode == DEBUG_MODE)
      printf("Msg:Can't find file %s.\n",DBCONNFILE);
    return 0;
  }
  clientDB.setDB(dbuser,dbpasswd,dbhost);
  if(!clientDB.initDB())
  {
    if(runmode == DEBUG_MODE)
      printf("Msg:Can't connect DB.\n");
    return 0;	
  }
  else
    if(runmode == DEBUG_MODE)
      printf("Msg:Connected Database.\n");
    
  clientTcp.setSamSClientCfg(clientCfg.port,clientCfg.ipaddr,clientCfg.sendwait,clientCfg.recvwait);    

    if(runmode == DEBUG_MODE)
     printf("Msg:setSamSClientCfg ok.\n");

  int s;
  signal(SIGINT,getStopSignal);  
  signal(SIGTERM,backJob);  
  signal(SIGSTOP,backJob);  
  signal(SIGKILL,backJob);  
  
  while(1)
  {
  	if ((myfp=fopen(MyFileName,"a+"))==NULL)
           {
     	       printf("%s文件打开失败!\n",MyFileName);
  	       exit(2);	
           }
    while(1)
    {
      //if(runmode == DEBUG_MODE)
       // printf("Msg:I want to fetch record\n");

        DBStatus=clientDB.fetchRecord();
 
     if(DBStatus==DBNORMAL) 
      {      	
        if(runmode == DEBUG_MODE)
          printf("Msg:Fetch record :ok\n");

        sendpacketid++;
         
      	
      	clientDB.setPacketData(sendPacket);      
      	nSubCode=clientDB.getOperateType();      	
      	if (nSubCode>=100 && nSubCode<130)
			sendPacket.setCode(SAMDEPOSITREQ);
		else if (nSubCode>=130 && nSubCode<140)
			sendPacket.setCode(SAMCDRREQ);
		else
			sendPacket.setCode(nCode); //OBSREQ

      	sendPacket.setVersion(NEWVERSION);
      	sendPacket.setID(sendpacketid);      	
      	sendPacket.setAuth(clientCfg.sender,clientCfg.recver,
      	                     clientCfg.repeat,nSubCode);      	
        time(&sj);
        mytime=localtime(&sj);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -