136 lines
3.5 KiB
C++
136 lines
3.5 KiB
C++
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
#include <fcntl.h>// open
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/stat.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <sys/wait.h>
|
|||
|
#include <signal.h>
|
|||
|
#include <chrono>
|
|||
|
#include <spdlog/spdlog.h>
|
|||
|
#include <spdlog/sinks/rotating_file_sink.h>
|
|||
|
#include <zmqpp/zmqpp.hpp>
|
|||
|
|
|||
|
using namespace std;
|
|||
|
|
|||
|
#define DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__)
|
|||
|
#define LOG(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__)
|
|||
|
#define WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__)
|
|||
|
#define ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__)
|
|||
|
|
|||
|
#define MAXFILE 65535
|
|||
|
|
|||
|
volatile sig_atomic_t _running = 1;
|
|||
|
int fd;
|
|||
|
|
|||
|
// signal handler
|
|||
|
void sigterm_handler(int arg)
|
|||
|
{
|
|||
|
_running = 0;
|
|||
|
}
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
pid_t pid;
|
|||
|
|
|||
|
/* 屏蔽一些有关控制终端操作的信号
|
|||
|
* 防止在守护进程没有正常运转起来时,因控制终端受到干扰退出或挂起
|
|||
|
* */
|
|||
|
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(SIGTERM, SIG_IGN);// 终止
|
|||
|
|
|||
|
// test
|
|||
|
//sleep(20);// try cmd: ./test &; kill -s SIGTERM PID
|
|||
|
|
|||
|
|
|||
|
// [1] fork child process and exit father process
|
|||
|
pid = fork();
|
|||
|
if(pid < 0)
|
|||
|
{
|
|||
|
perror("fork error!");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
else if(pid > 0)
|
|||
|
{
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
|
|||
|
// [2] create a new session
|
|||
|
setsid();
|
|||
|
|
|||
|
// [3] set current path
|
|||
|
char szPath[1024] = {0};
|
|||
|
if(getcwd(szPath, sizeof(szPath)) == NULL)
|
|||
|
{
|
|||
|
perror("getcwd");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
chdir(szPath);
|
|||
|
//printf("set current path succ [%s]\n", szPath);
|
|||
|
}
|
|||
|
|
|||
|
// [4] umask 0
|
|||
|
umask(0);
|
|||
|
|
|||
|
// [5] close useless fd
|
|||
|
int i;
|
|||
|
for (i = 3; i < MAXFILE; ++i)
|
|||
|
{
|
|||
|
close(i);
|
|||
|
}
|
|||
|
|
|||
|
// [6] set termianl signal
|
|||
|
signal(SIGTERM, sigterm_handler);
|
|||
|
|
|||
|
// Create a file rotating logger with 5 MB size max and 3 rotated files
|
|||
|
auto max_size = 1048576 * 5;
|
|||
|
auto max_files = 3;
|
|||
|
auto logger = spdlog::rotating_logger_mt("hjems-notifier", "./hjems-notifier.log", max_size, max_files);
|
|||
|
spdlog::set_default_logger(logger);
|
|||
|
// 遇到warn或者更高级别,比如err,critical 立即flush日志,防止丢失
|
|||
|
logger->flush_on(spdlog::level::warn);
|
|||
|
spdlog::flush_every(std::chrono::seconds(3));
|
|||
|
|
|||
|
|
|||
|
LOG("===== welcome to earth =====");
|
|||
|
|
|||
|
//const string endpoint = "tcp://139.196.5.21:44242";
|
|||
|
const string endpoint = "tcp://localhost:4242";
|
|||
|
|
|||
|
// initialize the 0MQ context
|
|||
|
zmqpp::context context;
|
|||
|
|
|||
|
// generate a push socket
|
|||
|
zmqpp::socket_type type = zmqpp::socket_type::push;
|
|||
|
zmqpp::socket socket (context, type);
|
|||
|
|
|||
|
// open the connection
|
|||
|
LOG("Opening connection to %s",endpoint);
|
|||
|
socket.connect(endpoint);
|
|||
|
|
|||
|
// do sth in loop
|
|||
|
while(_running)
|
|||
|
{
|
|||
|
zmqpp::message message;
|
|||
|
// compose a message from a string and a number
|
|||
|
message << "Hello World!" << 42;
|
|||
|
socket.send(message);
|
|||
|
|
|||
|
LOG("send a message");
|
|||
|
|
|||
|
usleep(1000*1000);// 1 s
|
|||
|
}
|
|||
|
|
|||
|
LOG("===== I will be back =====");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|