如何在C程序中实现WSL2时钟与Windows主机同步,无需sudo密码
解决WSL2中C程序时钟同步无需密码的方案
方案1:授权特定用户免密执行hwclock -s
这是最安全且直接的方式,仅给你的WSL账号开放执行时钟同步命令的免密权限:
- 打开终端,运行
sudo visudo编辑sudoers配置文件 - 在文件末尾添加一行(替换成你的实际WSL用户名):
your_username ALL=(ALL) NOPASSWD: /sbin/hwclock -s - 保存退出(visudo中按
Ctrl+O确认保存,回车后按Ctrl+X退出)
配置完成后,C程序里直接调用system("sudo hwclock -s");即可无密码同步时钟,且仅授权了单一特定命令,避免过度开放权限。
方案2:读取Windows主机时间同步(需配合免密date命令)
如果不想依赖hwclock,可以直接读取Windows系统时间来同步WSL时钟:
编写C函数实现时间读取与同步:
#include <stdio.h> #include <stdlib.h> #include <time.h> void sync_wsl_clock() { FILE *fp = popen("wmic os get localdatetime /value", "r"); if (!fp) { perror("Failed to get Windows time"); return; } char buf[128]; char raw_time[15]; while (fgets(buf, sizeof(buf), fp)) { if (sscanf(buf, "LocalDateTime=%14s", raw_time) == 1) { // 转换为date命令可识别的格式 char formatted_time[20]; snprintf(formatted_time, sizeof(formatted_time), "%.*s-%.*s-%.*s %.*s:%.*s:%.*s", 4, raw_time, 2, raw_time+4, 2, raw_time+6, 2, raw_time+8, 2, raw_time+10, 2, raw_time+12); // 调用date命令设置时间 char cmd[128]; snprintf(cmd, sizeof(cmd), "sudo date -s \"%s\"", formatted_time); system(cmd); break; } } pclose(fp); } int main() { sync_wsl_clock(); time_t now = time(NULL); printf("Current time: %s", ctime(&now)); return 0; }
之后同样需要通过sudo visudo给用户授权免密执行date -s命令:
your_username ALL=(ALL) NOPASSWD: /bin/date -s *
方案3:开启WSL2自动时钟同步(推荐)
新版本WSL2已支持休眠恢复后自动同步时钟,无需手动编写代码:
- 运行
wsl --version检查版本,若低于0.67.6,执行wsl --update升级 - 在Windows用户目录下创建/编辑
.wslconfig文件,添加以下配置:[wsl2] clockSync=true - 重启WSL(
wsl --shutdown后重新打开终端),此后休眠恢复时WSL会自动同步时钟,无需在C程序中额外处理。
内容的提问来源于stack exchange,提问作者Dabbo
相关产品推荐
相关产品推荐

