兼容windows与linux的写日志代码

以下代码可在windows与linux上正确编译和执行。

日志按照QQ号和日期为单位分类进行存放,可防止不同QQ号的日志混放在一起,以及日志随着时间逐渐变大等问题。

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 #include <time.h>
 4 
 5 #ifdef WIN32
 6 #include <direct.h>
 7 #include <io.h>
 8 #else
 9 #include <stdarg.h>
10 #include <sys/stat.h>
11 #include <unistd.h>
12 #endif
13 
14 typedef unsigned int UINT;
15 
16 void PrintDebugMsg(UINT uin, const char* msg, ...)
17 {
18 // 非debug版本,直接返回
19 #ifndef DEBUG
20     return;
21 #endif
22 
23     char szMessage[1024] = { 0 };
24     va_list pArg;
25     va_start(pArg, msg);
26 #ifdef WIN32
27     _vsnprintf(szMessage, 1023, msg, pArg);
28 #else
29     vsnprintf(szMessage, 1023, msg, pArg);
30 #endif    
31     va_end(pArg);
32     
33     time_t nNowTime = time(NULL); 
34     tm *pDate    = localtime(&nNowTime);
35     if (pDate==NULL) return;
36     
37     int nYear = 1900 + pDate->tm_year;
38     int nMonth = pDate->tm_mon+1;
39     int nDay = pDate->tm_mday;
40     int nHour = pDate->tm_hour;
41     int nMin  = pDate->tm_min;
42     int nSec  = pDate->tm_sec;
43 
44     // 日志按QQ和天来存放
45     
46     char* pDirPath = NULL;
47     char szLogPath[1024] = { 0 };
48 #ifdef WIN32
49     pDirPath = "E:\\debugLog";
50     _snprintf(szLogPath, 1023, "%s\\p%u_%04d-%02d-%02d.log", pDirPath, uin, nYear, nMonth, nDay);
51     // 目录不存在创建目录
52     if (_access(pDirPath,0)!=0)
53         if (_mkdir(pDirPath)!=0) return;
54 #else
55     pDirPath = "/home/game/log/debugLog";
56     snprintf(szLogPath, 1023, "%s/p%u_%04d-%02d-%02d.log", pDirPath, uin, nYear, nMonth, nDay);
57     if (access(pDirPath,0)!=0)
58         if (mkdir(pDirPath, 0755)!=0) return;
59 #endif
60     
61     // 追加的方式打开日志
62     FILE* pLoger=fopen(szLogPath, "a");
63     if (pLoger==NULL) return;
64     
65     // 时间    
66     fprintf(pLoger, "[%02d:%02d:%02d] ", nHour, nMin, nSec);
67     
68     // 具体日志内容
69     fprintf(pLoger, szMessage);
70     
71     fprintf(pLoger, "\n");        
72     fclose(pLoger);
73 }
74 
75 
76 int main(int argc, char* argv[])
77 {
78     char* pFunctionName = "MySQL::OnExcute";
79     int nLineNum = 54;
80     char* pMsg = "select * from Name";
81     while(nLineNum--) PrintDebugMsg(12345678, "%s %d %s",pFunctionName, nLineNum, pMsg);
82 
83     return 0;
84 }

函数mkdir(const char *pathname, mode_t mode)在解释mode_t时是将这里的mode当成8进制的去解释

参数 mode(均按8进制去解释)有下列数种组合:

S_ISUID   04000 文件的执行时设置用户ID(set user-id on execution)位
S_ISGID   02000 文件的执行时设置组ID(set group-id on execution)位
S_ISVTX   01000 文件的保存正文(粘着位sticky)位


S_IRWXU = S_IREAD | S_IWUSRS_IXUSR   00700   // 文件所有者具有读、写、执行权限
S_IRUSRS_IREAD)  00400   // 文件所有者具可读取权限
S_IWUSRS_IWRITE)  00200   // 文件所有者具可写入权限
S_IXUSRS_IEXEC)  00100   // 文件所有者具可执行权限


S_IRWXG   00070 = S_IRGRPS_IWGRPS_IXGRP  // 用户组具有读、写、执行权限
S_IRGRP   00040   // 用户组具可读取权限
S_IWGRP   00020   // 用户组具可写入权限
S_IXGRP   00010   // 用户组具可执行权限


S_IRWXOS_IROTHS_IWOTHS_IXOTH = 00007  // 其他用户具有读、写、执行权限
S_IROTH   00004   // 其他用户具可读取权限
S_IWOTH   00002  // 其他用户具可写入权限
S_IXOTH   00001  // 其他用户具可执行权限

mode为0755时,即:S_IRWXU(文件所有者具有读、写、执行权限)、S_IRGRP+S_IXGRP(用户组具有读、执行权限)、S_IROTH+S_IXOTH(其他用户具有读、执行权限)

mode为0766时,即:S_IRWXU(文件所有者具有读、写、执行权限)、S_IRGRP+S_IWGRP(用户组具有读、写权限)、S_IROTH+S_IWOTH(其他用户具有读、写权限)

一般创建目录的时候应该给可执行权限,也就是755,否则是无法cd切换目录进去的

原文地址:https://www.cnblogs.com/kekec/p/2740075.html