tc_common是很common的, 里面就是一些很common的功能。 很多软件开发, 可以直接用这些common代码, 省事,放心。
里面的代码很简单, 来看一个模板特化的代码实例:
template <>
string TC_Common::tostr<char>(const char &t)
{
char buf[2];
snprintf(buf, 2, "%c", t);
return string(buf);
}
基本上, 搞懂了这个, 就搞懂了tc_common.cpp, 而模板特化, 我们不久前已经说过, 无非就是特殊化而已。
整理来看,tc_common.cpp里面无非就是:
1. 数值转为字符串
2. 字符串基本操作
3. 时间转换与计算
4. 其他
有几个点值得注意, 先看:
int64_t TC_Common::now2ms()
{
struct timeval tv;
gettimeofday(&tv, 0);
return tv.tv_sec * (int64_t)1000 + tv.tv_usec/1000;
}
为什么在1000之前有int64_t呢? 很多人写代码不加这个, 导致溢出, 最后结果错误。 之前博客已经已经说过两次了。
再看:
void TC_Common::daemon()
{
pid_t pid;
if ((pid = fork()) != 0)
{
exit(0);
}
setsid();
signal(SIGINT, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
signal(SIGTTOU, SIG_IGN);
signal(SIGTTIN, SIG_IGN);
signal(SIGCHLD, SIG_IGN);
signal(SIGTERM, SIG_IGN);
ignorePipe();
if((pid = fork()) != 0)
{
//父进程结束,变成daemon
exit(0);
}
umask(0);
// chdir("/");
}
下次写守护进程, 就很easy了, 直接套用。
再看:
void TC_Common::ignorePipe()
{
struct sigaction sig;
memset(&sig,0,sizeof(struct sigaction));
sig.sa_handler = SIG_IGN;
sig.sa_flags = 0;
sigemptyset(&sig.sa_mask);
sigaction(SIGPIPE,&sig,NULL);
}
这段代码是干什么用的呢? 创建守护进程需要用, 而且在写服务端程序的时候, 也需要用, 否则会让服务器产生core dump, 为什么呢? 因为:https://blog.youkuaiyun.com/stpeace/article/details/79596548, 所以, 要特别注意这点。
其他的, 都很简单, 故不细说。 不要重复造轮子, 直接用tc_common.h/tc_common.cpp吧。
最后说一点: tc_common中的众多类函数都是static的, 所以才可以用TC_Common::trim这种方式来调用。