1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
| #include <sys/time.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <time.h> #include <unistd.h> #include <getopt.h>
/** * 时间管理工具配置 */ typedef struct { int set_time; time_t target_time; int show_time; int sync_time; char time_string[64]; int verbose; } time_tool_config_t;
/** * 显示帮助信息 */ void show_help(const char *program_name) { printf("用法: %s [选项]\n", program_name); printf("\n选项:\n"); printf(" -s, --set TIME 设置系统时间 (格式: YYYY-MM-DD HH:MM:SS)\n"); printf(" -g, --get 显示当前系统时间\n"); printf(" -S, --sync 同步时间\n"); printf(" -v, --verbose 详细输出\n"); printf(" -h, --help 显示此帮助信息\n"); printf("\n示例:\n"); printf(" %s -g # 显示当前时间\n", program_name); printf(" %s -s \"2023-12-25 10:30:00\" # 设置时间\n", program_name); printf(" %s -v -g # 详细显示当前时间\n", program_name); }
/** * 解析时间字符串 */ int parse_time_string(const char *time_str, time_t *result) { struct tm tm_time = {0}; char *endptr; // 尝试解析 ISO 格式时间: YYYY-MM-DD HH:MM:SS if (strptime(time_str, "%Y-%m-%d %H:%M:%S", &tm_time) != NULL) { *result = mktime(&tm_time); if (*result == -1) { printf("时间转换失败\n"); return -1; } return 0; } // 尝试解析 Unix 时间戳 *result = strtol(time_str, &endptr, 10); if (*endptr == '\0' && *result > 0) { return 0; } printf("无法解析时间字符串: %s\n", time_str); printf("支持的格式:\n"); printf(" YYYY-MM-DD HH:MM:SS\n"); printf(" Unix时间戳\n"); return -1; }
/** * 详细显示时间信息 */ void show_detailed_time() { struct timeval tv; struct tm *tm_info; char time_str[128]; if (gettimeofday(&tv, NULL) == 0) { // 显示多种时间格式 tm_info = localtime(&tv.tv_sec); // 标准格式 strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", tm_info); printf("标准时间: %s.%06ld\n", time_str, tv.tv_usec); // Unix时间戳 printf("Unix时间戳: %ld.%06ld\n", tv.tv_sec, tv.tv_usec); // UTC时间 tm_info = gmtime(&tv.tv_sec); strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S UTC", tm_info); printf("UTC时间: %s\n", time_str); // 星期和年份信息 strftime(time_str, sizeof(time_str), "%A, %B %d, %Y", localtime(&tv.tv_sec)); printf("详细日期: %s\n", time_str); } else { printf("获取时间失败: %s\n", strerror(errno)); } }
/** * 设置系统时间 */ int set_system_time(time_t target_time) { struct timeval tv; struct timezone tz = {0, 0}; int result; printf("设置系统时间为: %ld\n", target_time); tv.tv_sec = target_time; tv.tv_usec = 0; result = settimeofday(&tv, &tz); if (result == 0) { printf("✓ 系统时间设置成功\n"); show_current_time(); return 0; } else { printf("✗ 系统时间设置失败: %s\n", strerror(errno)); if (errno == EPERM) { printf(" 需要root权限来设置系统时间\n"); } return -1; } }
/** * 演示时间管理工具 */ int demo_time_management_tool() { time_tool_config_t config = {0}; uid_t uid = getuid(); printf("=== 时间管理工具演示 ===\n"); // 显示工具信息 printf("工具功能:\n"); printf(" 1. 显示系统时间\n"); printf(" 2. 设置系统时间\n"); printf(" 3. 时间同步\n"); printf(" 4. 详细时间信息\n"); // 权限检查 printf("\n权限检查:\n"); printf(" 当前用户ID: %d\n", uid); if (uid == 0) { printf(" ✓ 具有root权限,可以设置系统时间\n"); } else { printf(" ✗ 没有root权限,时间设置功能将受限\n"); } // 演示显示时间功能 printf("\n1. 显示当前时间:\n"); show_current_time(); printf("\n2. 详细时间信息:\n"); show_detailed_time(); // 演示时间设置功能 printf("\n3. 时间设置功能演示:\n"); // 获取当前时间 struct timeval current_time; if (gettimeofday(¤t_time, NULL) == 0) { time_t future_time = current_time.tv_sec + 60; // 1分钟后 printf(" 尝试设置时间为1分钟后: %ld\n", future_time); if (uid == 0) { // 有权限时尝试设置 if (set_system_time(future_time) == 0) { printf(" ✓ 时间设置成功\n"); // 恢复原始时间 printf(" 恢复原始时间: %ld\n", current_time.tv_sec); set_system_time(current_time.tv_sec); } } else { // 无权限时模拟设置 struct timeval future_tv; future_tv.tv_sec = future_time; future_tv.tv_usec = current_time.tv_usec; int result = settimeofday(&future_tv, NULL); if (result != 0) { printf(" ✗ 时间设置失败 (预期): %s\n", strerror(errno)); printf(" 需要root权限才能设置系统时间\n"); } } } // 演示时间格式解析 printf("\n4. 时间格式解析演示:\n"); const char *time_formats[] = { "2023-12-25 10:30:00", "1703498200", // Unix时间戳 NULL }; for (int i = 0; time_formats[i]; i++) { time_t parsed_time; printf(" 解析时间字符串: %s\n", time_formats[i]); if (parse_time_string(time_formats[i], &parsed_time) == 0) { printf(" ✓ 解析成功: %ld\n", parsed_time); } else { printf(" ✗ 解析失败\n"); } } // 显示工具使用建议 printf("\n=== 工具使用建议 ===\n"); printf("1. 时间设置需要root权限\n"); printf("2. 建议使用NTP服务进行时间同步\n"); printf("3. 避免频繁手动调整系统时间\n"); printf("4. 记录时间变更操作日志\n"); printf("5. 使用逐步调整避免时间跳跃\n"); return 0; }
// 辅助函数声明 void show_current_time();
int main() { return demo_time_management_tool(); }
|