emsApplication/applications/ems_beehub/BeeHub/beehub.cpp

136 lines
3.5 KiB
C++
Raw Normal View History

2024-05-24 12:19:45 +08:00
#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;
}