354 lines
5.8 KiB
C
354 lines
5.8 KiB
C
|
|
|
|||
|
|
|
|||
|
|
#ifndef _SYSTEM_LINUXPORTABLE_H
|
|||
|
|
#define _SYSTEM_LINUXPORTABLE_H
|
|||
|
|
|
|||
|
|
#include <unistd.h>
|
|||
|
|
#include <string.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include <stdio.h>
|
|||
|
|
#include <math.h>
|
|||
|
|
#include <signal.h>
|
|||
|
|
#include <fcntl.h>
|
|||
|
|
#include <sys/param.h>
|
|||
|
|
#include <sys/types.h>
|
|||
|
|
#include <sys/stat.h>
|
|||
|
|
#include <fcntl.h>
|
|||
|
|
#include <uuid/uuid.h>
|
|||
|
|
|
|||
|
|
// 日期和时间
|
|||
|
|
struct port_date_time_t
|
|||
|
|
{
|
|||
|
|
int nYear;
|
|||
|
|
int nMonth;
|
|||
|
|
int nDay;
|
|||
|
|
int nHour;
|
|||
|
|
int nMinute;
|
|||
|
|
int nSecond;
|
|||
|
|
int nMilliseconds;
|
|||
|
|
int nDayOfWeek;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 内存使用情况
|
|||
|
|
struct port_memory_info_t
|
|||
|
|
{
|
|||
|
|
double dMemoryLoad;
|
|||
|
|
double dTotalMemory;
|
|||
|
|
double dAvailMemory;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 唯一标识符
|
|||
|
|
struct port_uuid_t
|
|||
|
|
{
|
|||
|
|
unsigned long Data1;
|
|||
|
|
unsigned short Data2;
|
|||
|
|
unsigned short Data3;
|
|||
|
|
unsigned char Data4[8];
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 获得本地当前时间
|
|||
|
|
inline bool Port_GetLocalTime(port_date_time_t* dt)
|
|||
|
|
{
|
|||
|
|
struct timeval tv;
|
|||
|
|
|
|||
|
|
gettimeofday(&tv, NULL);
|
|||
|
|
|
|||
|
|
tm* pt = localtime(&tv.tv_sec);
|
|||
|
|
|
|||
|
|
dt->nYear = pt->tm_year + 1900;
|
|||
|
|
dt->nMonth = pt->tm_mon + 1;
|
|||
|
|
dt->nDay = pt->tm_mday;
|
|||
|
|
dt->nHour = pt->tm_hour;
|
|||
|
|
dt->nMinute = pt->tm_min;
|
|||
|
|
dt->nSecond = pt->tm_sec;
|
|||
|
|
dt->nMilliseconds = tv.tv_usec / 1000;
|
|||
|
|
dt->nDayOfWeek = pt->tm_wday;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获得系统计时
|
|||
|
|
// inline long long Port_GetTickCount()
|
|||
|
|
// {
|
|||
|
|
// time_t t = time(NULL);
|
|||
|
|
// struct tm tm;
|
|||
|
|
// localtime_r(&t,&tm);
|
|||
|
|
|
|||
|
|
// unsigned int timetotle = mktime(&tm);
|
|||
|
|
|
|||
|
|
|
|||
|
|
// struct timeval tv;
|
|||
|
|
|
|||
|
|
// gettimeofday(&tv, NULL);
|
|||
|
|
|
|||
|
|
// long long nDailyTime = (long long)timetotle*1000 + tv.tv_usec / 1000;
|
|||
|
|
// return nDailyTime;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// 获得系统计时
|
|||
|
|
inline unsigned int Port_GetTickCountOld()
|
|||
|
|
{
|
|||
|
|
struct timeval tv;
|
|||
|
|
|
|||
|
|
gettimeofday(&tv, NULL);
|
|||
|
|
|
|||
|
|
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获得当前高精度时刻
|
|||
|
|
inline double Port_GetPerformanceTime()
|
|||
|
|
{
|
|||
|
|
struct timeval tv;
|
|||
|
|
|
|||
|
|
gettimeofday(&tv, NULL);
|
|||
|
|
|
|||
|
|
return (double)tv.tv_sec + (double)tv.tv_usec * 0.000001;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 系统休眠
|
|||
|
|
inline void Port_Sleep(unsigned int ms)
|
|||
|
|
{
|
|||
|
|
struct timespec ts;
|
|||
|
|
|
|||
|
|
ts.tv_sec = 0;
|
|||
|
|
ts.tv_nsec = ms * 1000000;
|
|||
|
|
|
|||
|
|
nanosleep(&ts, NULL);
|
|||
|
|
//usleep(ms * 1000);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 是否非法的浮点数
|
|||
|
|
inline int Port_IsNaN(float value)
|
|||
|
|
{
|
|||
|
|
return isnan(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建唯一标识符
|
|||
|
|
inline const char* Port_CreateGuid(char* buffer, size_t size)
|
|||
|
|
{
|
|||
|
|
port_uuid_t id;
|
|||
|
|
|
|||
|
|
uuid_generate((unsigned char*)&id);
|
|||
|
|
|
|||
|
|
snprintf(buffer, size - 1,
|
|||
|
|
"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",
|
|||
|
|
id.Data1, id.Data2, id.Data3,
|
|||
|
|
id.Data4[0], id.Data4[1], id.Data4[2], id.Data4[3],
|
|||
|
|
id.Data4[4], id.Data4[5], id.Data4[6], id.Data4[7]);
|
|||
|
|
|
|||
|
|
buffer[size - 1] = 0;
|
|||
|
|
|
|||
|
|
return buffer;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 弹出信息窗口
|
|||
|
|
inline void Port_PopupMsgBox(const char* info, const char* title)
|
|||
|
|
{
|
|||
|
|
printf("(msg)%s:%s\n", title, info);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 弹出错误信息窗口
|
|||
|
|
inline void Port_PopupErrorMsgBox(const char* info, const char* title)
|
|||
|
|
{
|
|||
|
|
printf("(err)%s:%s\n", title, info);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获得当前的进程ID
|
|||
|
|
inline unsigned int Port_GetCurrentProcessId()
|
|||
|
|
{
|
|||
|
|
return getpid();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获得当前执行文件的路径
|
|||
|
|
inline bool Port_GetCurrentModuleFileName(char* buffer, size_t size)
|
|||
|
|
{
|
|||
|
|
ssize_t res = readlink("/proc/self/exe", buffer, size);
|
|||
|
|
|
|||
|
|
if ((res < 0) || (res >= size))
|
|||
|
|
{
|
|||
|
|
buffer[0] = 0;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
buffer[res] = 0;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 终止进程
|
|||
|
|
inline bool Port_KillProcess(unsigned int proc_id)
|
|||
|
|
{
|
|||
|
|
return kill(proc_id, SIGKILL);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
inline char* skip_token(char* fp)
|
|||
|
|
{
|
|||
|
|
char* ptr = fp;
|
|||
|
|
|
|||
|
|
while (*ptr && (*ptr != ' '))
|
|||
|
|
{
|
|||
|
|
ptr++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
while (*ptr == ' ')
|
|||
|
|
{
|
|||
|
|
ptr++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ptr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获得内存使用情况
|
|||
|
|
inline bool Port_GetMemoryInfo(port_memory_info_t* pInfo)
|
|||
|
|
{
|
|||
|
|
memset(pInfo, 0, sizeof(port_memory_info_t));
|
|||
|
|
|
|||
|
|
// get system wide memory usage
|
|||
|
|
char buffer[1024];
|
|||
|
|
char* p;
|
|||
|
|
|
|||
|
|
int fd = open("/proc/meminfo" , O_RDONLY);
|
|||
|
|
int len = read(fd, buffer, sizeof (buffer) - 1);
|
|||
|
|
|
|||
|
|
close(fd);
|
|||
|
|
|
|||
|
|
buffer[len] = '\0';
|
|||
|
|
|
|||
|
|
p = buffer;
|
|||
|
|
p = skip_token(p);
|
|||
|
|
|
|||
|
|
pInfo->dTotalMemory = strtoul(p, &p, 10); // total memory
|
|||
|
|
|
|||
|
|
p = strchr(p, '\n');
|
|||
|
|
p = skip_token(p);
|
|||
|
|
|
|||
|
|
pInfo->dAvailMemory = strtoul(p, &p, 10); // free memory
|
|||
|
|
pInfo->dMemoryLoad = (1.0 - pInfo->dAvailMemory / pInfo->dTotalMemory);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获得CPU使用率
|
|||
|
|
inline double Port_GetCpuRate()
|
|||
|
|
{
|
|||
|
|
char buffer[256];
|
|||
|
|
char* p;
|
|||
|
|
|
|||
|
|
int fd = open("/proc/loadavg", O_RDONLY);
|
|||
|
|
int len = read(fd, buffer, sizeof(buffer) - 1);
|
|||
|
|
|
|||
|
|
close(fd);
|
|||
|
|
|
|||
|
|
buffer[len] = '\0';
|
|||
|
|
|
|||
|
|
double load_avg0 = strtod(buffer, &p);
|
|||
|
|
double load_avg1 = strtod(p, &p);
|
|||
|
|
double load_avg2 = strtod(p, &p);
|
|||
|
|
|
|||
|
|
return load_avg1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 初始化守护进程
|
|||
|
|
inline bool Port_InitDaemon()
|
|||
|
|
{
|
|||
|
|
int pid = fork();
|
|||
|
|
|
|||
|
|
if (pid > 0)
|
|||
|
|
{
|
|||
|
|
// 是父进程,结束父进程
|
|||
|
|
exit(0);
|
|||
|
|
}
|
|||
|
|
else if (pid < 0)
|
|||
|
|
{
|
|||
|
|
// fork失败,退出
|
|||
|
|
exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 是第一子进程,后台继续执行
|
|||
|
|
//第一子进程成为新的会话组长和进程组长
|
|||
|
|
setsid();
|
|||
|
|
|
|||
|
|
// 并与控制终端分离
|
|||
|
|
pid = fork();
|
|||
|
|
|
|||
|
|
if (pid > 0)
|
|||
|
|
{
|
|||
|
|
// 是第一子进程,结束第一子进程
|
|||
|
|
exit(0);
|
|||
|
|
}
|
|||
|
|
else if (pid < 0)
|
|||
|
|
{
|
|||
|
|
// fork失败,退出
|
|||
|
|
exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 是第二子进程,继续
|
|||
|
|
// 第二子进程不再是会话组长
|
|||
|
|
|
|||
|
|
//关闭打开的文件描述符
|
|||
|
|
for (int i = 0; i < NOFILE; ++i)
|
|||
|
|
{
|
|||
|
|
close(i);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
umask(0); //重设文件创建掩模
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 启动控制台程序
|
|||
|
|
inline bool Port_Execute(const char* cmd_line)
|
|||
|
|
{
|
|||
|
|
char cmd[256];
|
|||
|
|
size_t size = strlen(cmd_line) + 1;
|
|||
|
|
|
|||
|
|
if (size > sizeof(cmd))
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
memcpy(cmd, cmd_line, size);
|
|||
|
|
|
|||
|
|
char* argv[16] = { NULL };
|
|||
|
|
char* envp[1] = { NULL };
|
|||
|
|
|
|||
|
|
int argc = 0;
|
|||
|
|
|
|||
|
|
argv[argc++] = cmd;
|
|||
|
|
|
|||
|
|
char* p = strchr(cmd, ' ');
|
|||
|
|
|
|||
|
|
while (p)
|
|||
|
|
{
|
|||
|
|
*p = 0;
|
|||
|
|
|
|||
|
|
while (*(++p) == ' ')
|
|||
|
|
{
|
|||
|
|
*p = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
argv[argc++] = p;
|
|||
|
|
|
|||
|
|
if (argc == (sizeof(argv) / sizeof(argv[0]) - 1))
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int pid = fork();
|
|||
|
|
|
|||
|
|
if (0 == pid)
|
|||
|
|
{
|
|||
|
|
// 子进程
|
|||
|
|
if (execve(cmd, argv, envp) == -1)
|
|||
|
|
{
|
|||
|
|
// 启动程序失败,关闭子进程
|
|||
|
|
exit(0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return pid > 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif // _SYSTEM_LINUXPORTABLE_H
|