📄 natsvr.c
字号:
/*********************************************************************
* 模块名称:natsvr
* 说明:系统进程管理模块
* 其它说明:
* 作者: 刘青山
* 时间 : 2004-09-22 21:13:30
*********************************************************************/
#include "natpacket.h"
#include "natsvr.h"
#include "netcomm.h"
#include <unistd.h>
#include "memory.h"
#include "log.h"
#include "hash.h"
#include "cmd_control.h"
#define AUTHOR "LiuQingShan (lqs10@163.net)"
#define VERSION "1.0.0"
BOOL g_bFinished = false ;
static void ShowVersion()
{
char temp[100];
sprintf( temp, "natsvr version %s - by %s\n", VERSION, AUTHOR );
printf( temp );
}
static void ShowHelp()
{
ShowVersion();
printf( "natsvr [command]\n" );
printf( "-d,-D\t\tRun as unix daemon process\n" );
printf( "-?,-h,-H\tShow help infomation\n" );
printf( "-v,-V\t\tShow this program's version\n" );
}
/*********************************************************************
* 函数名称:CloseAllFds
* 说明:关闭进程占用的所有文件描述符
* 入口参数:
* int fd -- 默认为0,表示关闭从0开始的文件描述符
* 返回值:
* static void --
* 被本函数调用的函数清单:
* 调用本函数的函数清单:
* 其它说明:
* 作者: 刘青山
* 时间 : 2004-09-23 09:12:07
*********************************************************************/
static void CloseAllFds( int fd )
{
int fdlimit = sysconf( _SC_OPEN_MAX );
while ( fd < fdlimit )
close( fd++ );
}
/*********************************************************************
* 函数名称:RunDaemon
* 说明:作为UNIX守护进程运行
* 入口参数:
* 返回值:
* static int -- 正确返回0,其它负数
* 被本函数调用的函数清单:
* 调用本函数的函数清单:
* 其它说明:
* 作者: 刘青山
* 时间 : 2004-09-23 09:10:50
*********************************************************************/
static int RunDaemon()
{
switch ( fork() )
{
case 0: break;
case -1: return -1;
default: _exit(0); /* exit the original process */
}
if ( setsid() < 0 ) /* shouldn't fail */
return -1;
switch ( fork() )
{
case 0: break;
case -1: return -1;
default: _exit(0);
}
/* change to root dir to ensure no directory is blocked */
chdir( "/" );
/* close all fds */
CloseAllFds( 0 );
dup( 0 );
dup( 0 );
return 0;
}
static void signal_handler(int nSIG)
{
switch (nSIG)
{
case SIGINT:
case SIGTERM:
case SIGQUIT:
signal(nSIG, SIG_IGN);
usleep(1000);
LogOut(KLOG_WARN, "Receive stop signal,ready to stop service");
g_bFinished = true ;
usleep(1000);
signal(nSIG, signal_handler);
break;
default:
break;
}
}
int main(int argc, char* argv[])
{
int iError ;
int c;
char isdaemon = 0;
char log_path[MAX_PATH];
iError = 1 ;
if (!getcwd(log_path, sizeof(log_path)))
{
printf("Can not get current path\n");
abort();
}
strcat(log_path, "/p2p.log");
printf("Current log path %s\n", log_path);
while ( ( c = getopt(argc, argv, "DdVvHh?")) != -1 )
{
iError = 0 ;
switch( c )
{
case 'D':
case 'd':
isdaemon = 1;
break;
case 'V':
case 'v':
ShowVersion();
exit(0);
break;
case 'H':
case 'h':
case '?':
ShowHelp();
return 0;
default:
ShowHelp();
abort();
}
}
if ( isdaemon )
{
RunDaemon();
}
// 信号处理
signal(SIGPIPE, SIG_IGN);
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
signal(SIGQUIT, signal_handler);
desinit(0);
des_setkey(SECRET_KEY);
OpenLog(log_path);
InitNetQueue();
InitHash();
InitMemIndex( ); // 初识化内存管理器
InitControl();
NetRuning() ;
CloseAllThread() ;
LogOut(KLOG_INFO, "Close All Thread" );
DestroyMem() ; // 销毁内存管理器
CloseLog() ;
pthread_mutex_destroy(&g_mtGlobalUser) ;
desdone();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -