1.深夜写完的代码——快速实现.NET(.net framework/.net core+)动态访问webservice服务
2.使用openwrt路由(例极路由3(HC5861))过校园网多设备检测(非破解) (宿舍共网)
3.2020-08-25
4.ntpdate失败报错“the NTP socket is in use, exiting”
5.ntpdc命令如何在交互模式下执行对等体列表操作?
6.linux C/C++实现同步NTP时间
深夜写完的代码——快速实现.NET(.net framework/.net core+)动态访问webservice服务
访问webservice服务时,通常采用服务引用方式,然而此法较为繁琐,尤其在服务更新时,需要手动更新引用并重新发布,极为不便。不二外卖系统源码现今,已有多例展示了在.NET Framework环境中实现动态访问webservice服务,却鲜少见到适用于.NET Core及更高版本的案例。本篇文章旨在提供一个通用解决方案,支持.NET Framework、.NET Core或以上环境的动态访问webservice服务接口,以供参考。
首先,创建一个webservice服务作为测试平台。该服务提供三种接口:无参数接口、字符串参数接口、包含多个实体类参数(实体类包含嵌套和集合)及返回带有嵌套和集合的返回数据。此设计基本涵盖了webservice服务的主要场景。
测试实体类已备好,用于验证服务接口。
服务已启动并就绪。互助平台源码下载
接下来,开发请求端程序,支持.NET Framework 4.6.1+、.NET Core+及.NET 5+所有版本。可以通过NuGet引入Wesky.Net.OpenTools包,确保使用最新版本以获取完善功能。本文以.NET 8控制台为例,使用者可根据需求自行调整引用。
程序中实例化WebserviceHelper对象,对于使用IOC容器的项目(如asp.net core),可进行依赖注入的注册;对于无需IOC容器的项目,直接new对象即可。获取asmx的url地址,并在结尾添加?wsdl。
设定要访问的服务名称,例如“HelloWorld”,然后调用接口。无参数情况下,参数设为null。
运行程序调用接口,获取xml文档返回值。mysql 5.5源码下载
调用返回类型为OpenToolResult,该类型包含基础类型值解析方法。解析后得到的最终返回消息为“Hello World”。
基础类型值解析方法定义了获取返回值、节点名称(一般为方法名称+“Result”)及命名空间的过程。命名空间在调用时会被存储在OpenWebserviceInfo的OpenWebservice集合中,通过url地址和接口方法名匹配到对应的命名空间。
OpenWebserviceDocCache类型定义了存储和管理命名空间的结构。
接着,尝试传入一个基础类型参数,访问“Hola”方法,传入“Wesky”,成功获取返回值“Wesky World”。
随后,模拟多个实体类参数的调用,服务应返回一个包含其他实体类的消息。
回顾TestService服务接口实现,确认动态访问是成功的。
访问webservice方法定义如下:支持0个或多个参数,参数个数需与解析wsdl地址的方法服务匹配。Result.IsSuccess为true表示请求成功,android获取html源码解析错误或请求失败时返回false,并附带具体错误描述。
返回值为实体类时,需要调用ExtractCustomerValueFromXml方法进行解析。以ResultInfo类型为例,此方法可处理返回实体类数据。
关键代码片段已列出,若本教程对你有所助益,请分享给需要的朋友,并关注公众号:Dotnet Dancer。如有需要,公众号后台回复“动态接口”获取演示代码和webservice测试源码。
OpenTools系列文章链接如下,新版本与旧版本完全兼容,无需更新任何代码即可使用:
版本1.0.:如何一行C#代码实现解析类型的Summary注释(适用于数据字典快速生成)
版本1.0.:C#/.NET一行代码将实体类类型转换为Json数据字符串
版本1.0.8:上位机与工控必备!用.NET快速搞定Modbus通信的方法
版本1.0.7:揭秘!.Net如何在5分钟内快速实现物联网扫码器通用扫码功能?
版本1.0.6:.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)
版本1.0.5:C#使用P/Invoke实现注册表的增删改查功能
版本1.0.3:C#实现转Base字符串,以及Base字符串在Markdown文件内的复原演示
版本1.0.2:C#实现Ping远程主机功能(支持IP和域名)
版本1.0.1:开始开源项目OpenTools的创作(第一个功能:AES加密解密)
备注此包版本完全开源,无第三方依赖,适用于.net framework 4.6+、任意其他跨平台.net版本环境。java ssh 源码下载
使用openwrt路由(例极路由3(HC))过校园网多设备检测(非破解) (宿舍共网)
校园网多设备检测使用openwrt路由(如极路由3(HC))的步骤和技巧如下:
首先,你需要了解校园网可能采取的检测策略,包括基于IPv4数据包包头内的TTL字段的检测、基于HTTP数据包请求头内的User-Agent字段的检测(UA2F)、DPI(深度包检测技术)、基于IPv4数据包包头内的Identification字段的检测、基于网络协议栈时钟偏移的检测技术、Flash Cookie检测技术。这些检测方法可能会限制多设备接入。
针对极路由3(HC),采用Lean大佬的Openwrt源码进行编译,登陆IP为..1.1,密码为"password"。在编译时,确保TurboACC技术关闭,以免影响User-Agent字段,导致问题如微信无法发送。解决方法是执行命令"uci set ua2f.firewall.handle_mmtls=0 && uci commit ua2f"。
刷入Openwrt后,进行以下配置:
1. 启用NTP客户端和作为NTP服务器提供服务,填写候选NTP服务器为:ntp1.aliyun.com、time1.cloud.tencent.com、stdtime.gov.hk、pool.ntp.org。
2. 添加自定义防火墙规则。
3. 对UA2F进行配置,确保检测正确。
配置完成后,即可进行多设备检测。确认真实User-Agent显示正确,说明配置成功。一个宿舍内可用一台路由器加一个账号上网。
感谢Lean提供的Openwrt源码,参考关于某大学校园网共享上网检测机制的研究与解决方案,UA2F技术来自Zxilly/UA2F,修改IPID技术来自CHN-beta/rkp-ipid。祝学子们早日摆脱校园网限制。
--
Prometheus å®ç°é®ä»¶åè¦ï¼Prometheus+Alertmanager+QQé®ç®±æè ç½æé®ç®±ï¼ç®åæµè¯è¿è¿ä¸¤ç§é®ç®±é½å¯ä»¥åéåè¦é®ä»¶ï¼
Prometheuså®ç°é®ä»¶åè¦åçå¦ä¸ï¼
Prometheuså®æ¹æä¸ä¸ªé带çä¸é´ä»¶ï¼alertmanagerï¼éè¿è®¾ç½®rulesè§ååè·¯ç±è½¬åå¯ä»¥å®ç°é®ä»¶åè¦ï¼åææ¯ä½ éè¦æä¸ä¸ªå¯ä»¥åéé®ä»¶çé®ä»¶æå¡ç«¯ï¼å¯ä»¥èªå»ºæè 使ç¨äºèç½å ¬å¸æä¾çå è´¹é®ç®±ï¼
åè¦åçå¾
Prometheuså®æ´æ¶æå¾
æä¹åå¾åºçé误ç»è®ºå¦ä¸ï¼
æ¨èç´æ¥å¨èææºæä½ç³»ç»ä¸ç´æ¥å®è£ PrometheusåAlertmanagerï¼ä¸æ¨èå ¶ä¸ä»»ä½ä¸æ¹å¨å®¹å¨ä¸è¿è¡ï¼å 为æµè¯è¿å¨å®¹å¨ä¸è¿è¡Prometheusåalertmanagerï¼ç»æåºç°å¦ä¸é误æ åµ
第ä¸ç§æ åµæ¯ï¼æçnode-exporteræ线è·æºäºï¼æå¨å ³æºï¼æ¨¡æçªç¶æ线è·æºï¼ï¼Prometheuså´æ示èç¹ä¾ç¶å¨çº¿ï¼ææ¶åå´è½å¤æ£å¸¸æ¾ç¤ºèç¹æ线è·æºï¼çæåè¦åéé®ä»¶
第äºç§æ åµæ¯ï¼æçnode-exporteræ线è·æºäºï¼æå¨å ³æºï¼æ¨¡æçªç¶æ线è·æºï¼ï¼Prometheusæ示èç¹æ线ï¼åè¦çæï¼ä½æ¯æ²¡æåéé®ä»¶ï¼ææå¨æ¢å¤node-exporteråï¼åè¦è§£é¤ï¼é®ä»¶è½æ£å¸¸åéé®ä»¶æ示åè¦å·²ç»è§£é¤ãããã
第ä¸ç§æ åµæ¯ï¼æçnode-exporteræ线è·æºäºï¼æå¨å ³æºï¼æ¨¡æçªç¶æ线è·æºï¼ï¼Prometheusæ示èç¹æ线ï¼åè¦çæï¼æ£å¸¸æååéé®ä»¶ï¼ææå¨æ¢å¤node-exporteråï¼åè¦è§£é¤ï¼é®ä»¶æ²¡æåéåºæ¥ãããã
以ä¸ä¸ç§æ åµä¹åç»å¸¸åºç°ï¼å½æ¶ç¬¬ä¸æ¥ä»¥ä¸ºæ¯èªå·±è®¾ç½®çscrape_intervalä¸åç导è´çï¼ç»æè°è¯å 次ï¼é®é¢æ²¡æ解å³ï¼ç¬¬äºæ¥ä»¥ä¸ºæ¯èªå·±çæå¡å¨æ¶é´æ²¡æåå°ç²¾ç¡®åæ¥ï¼ç¶åæå»è®¾ç½®åé¿éäºçntpæå¡å¨åæ¥ï¼ç»æé®é¢ä¾ç¶æ²¡æ解å³ï¼ç¬¬ä¸æ¥ï¼æ¢ä¸ªæ¹åï¼æalertmanagerè¿ç§»å°èææºæä½ç³»ç»ä¸å®è£ è¿è¡ï¼é®é¢è§£å³ï¼
å京æ¶é´æ¯GMT+8å°æ¶ï¼æäºåå¿çæ¶é´å¯è½æ¯UTCçï¼ä½æ¯å¦ææ¯å¨è¦æ±ä¸å¤ªåå精确çæ åµä¸ï¼UTCæ¶é´æ¯åå好çäºGMTæ¶é´
为äºé¿å æ¶åºçæ··ä¹±ï¼prometheusææçç»ä»¶å é¨é½å¼ºå¶ä½¿ç¨Unixæ¶é´ï¼å¯¹å¤å±ç¤ºä½¿ç¨GMTæ¶é´ã
è¦æ¹æ¶åºæ两个åæ³
1 .ä¿®æ¹æºç ï¼éæ°ç¼è¯ã
2. ä½¿ç¨ docker è¿è¡ Prometheusï¼æè½½æ¬å°æ¶åºæ件
docker run --restart always -e TZ=Asia/Shanghai --hostname prometheus --name prometheus-server -d -p : -v /data/prometheus/server/data:/prometheus -v /data/prometheus/server/conf/prometheus.yml:/etc/prometheus/prometheus.yml -u root prom/prometheus:v2.5.0
æ£æå¼å§
å®è£ alertmanager
容å¨å®è£ æ¹å¼ï¼
docker run -d --name alertmanager -p : -v /usr/local/Prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest
å å¨å®¿ä¸»æº/usr/local/Prometheusä¸å建ä¸ä¸ªæ件夹alertmanagerï¼ç¶åå¨æ件夹éå建alertmanager.ymlé ç½®æ件ï¼å¾ ä¼æè½æ å°å°alertmanager容å¨éç/etc/alertmanagerç®å½ä¸
globalï¼å ¨å±é ç½®
resolve_timeout: é®é¢è§£å³çè¶ æ¶æ¶é´
smtp_from: åéåè¦é®ä»¶çé®ç®±è´¦å·
smtp_smarthost: é®ç®± SMTP æå¡å°å,è¿éæ¯ä»¥QQé®ç®±ä¸ºä¾ï¼ä¹å¯ä»¥ç¨ç½æé®ç®±ï¼è¿ä¸ªåæä¹å设置zabbixé®ä»¶åè¦æ¶çé ç½®ä¸æ ·
smtp_auth_username: å¦æ没æ设置é®ç®±å«åï¼é£å°±æ¯è´¦æ·å
smtp_auth_password: é®ç®±çææç ï¼ä¸æ¯ è´¦æ·å¯ç ï¼ä½ å¯ä»¥å¨QQé®ç®±æè ç½æé®ç®±ç½é¡µç«¯è®¾ç½®ï¼å¼å¯ POP3/SMTP æå¡æ¶ä¼æ示ï¼åé ç½®zabbixé®ä»¶åè¦çæ¶åå ä¹ä¸æ ·
smtp_require_tls: æ¯å¦ä½¿ç¨ tlsï¼æ ¹æ®ç¯å¢ä¸åï¼æ¥éæ©å¼å¯åå ³éãå¦ææ示æ¥é email.loginAuth failed: Must issue a STARTTLS command firstï¼é£ä¹å°±éè¦è®¾ç½®ä¸º trueãçé说æä¸ä¸ï¼å¦æå¼å¯äº tlsï¼æ示æ¥é starttls failed: x: certificate signed by unknown authorityï¼éè¦å¨ email_configs ä¸é ç½® insecure_skip_verify: true æ¥è·³è¿ tls éªè¯ã
templatesï¼ åè¦æ¨¡æ¿ç®å½ï¼å¯ä»¥ä¸ç¼å模æ¿ï¼æé»è®¤æ¨¡æ¿
Subject: '{ { template "email.default.subject" . }}'
html: '{ { template "email.default.html" . }}'
routeï¼æ¥è¦çåå设置
group_byï¼åç»
group_wait: åç»çå¾ æ¶é´
group_interval: 5m æ¯ç»æ¶é´é´é
repeat_interval: m éå¤é´é
receiver: æ¥æ¶æ¹å¼ï¼è¯·æ³¨æï¼è¿éçååè¦å¯¹åºä¸é¢receiversä¸çä»»ä½ä¸ä¸ªååï¼ä¸ç¶ä¼æ¥éï¼è¿éå ¶å®å°±æ¯éæ©æ¹å¼ï¼æé®ç®±ï¼ä¼ä¸å¾®ä¿¡ï¼wehookï¼victoropsçç
receiversï¼æ¥åæ¹å¼æ±æ»ï¼å³åè¦æ¹å¼æ±æ»
ä¾åï¼
receivers:
- name:'default-receiver'
email_configs:
- to:'whiiip@.com'
html: '{ { template "alert.html" . }}'
headers: { Subject: "[WARN] æ¥è¦é®ä»¶test"}
inhibit_rules: æå¶è§å
å½åå¨ä¸å¦ä¸ç»å¹é çè¦æ¥ï¼æºï¼æ¶ï¼æå¶è§åå°ç¦ç¨ä¸ä¸ç»å¹é çè¦æ¥ï¼ç®æ ï¼ã
å æ¬æºå¹é åç®æ å¹é
alertmanagerå®æ¹æ¯è¿æ ·è¯´ç
Inhibition
Inhibition is a concept of suppressing notifications for certain alerts if certain other alerts are already firing.
Example: An alert is firing that informs that an entire cluster is not reachable. Alertmanager can be configured to mute all other alerts concerning this cluster if that particular alert is firing. This prevents notifications for hundreds or thousands of firing alerts that are unrelated to the actual issue.
Inhibitions are configured through the Alertmanager's configuration file.
å½åå¨ä¸å¦ä¸ç»å¹é å¨å¹é çè¦æ¥ï¼æºï¼æ¶ï¼ç¦æ¢è§åä¼ä½¿ä¸ä¸ç»å¹é å¨å¹é çè¦æ¥ï¼ç®æ ï¼éé³ãç®æ è¦æ¥åæºè¦æ¥çequalå表ä¸çæ ç¾å称é½å¿ é¡»å ·æç¸åçæ ç¾å¼ã
å¨è¯ä¹ä¸ï¼ç¼ºå°æ ç¾å带æ空å¼çæ ç¾æ¯åä¸ä»¶äºãå æ¤ï¼å¦æequalæºè¦æ¥åç®æ è¦æ¥é½ç¼ºå°ååºçæææ ç¾å称ï¼åå°åºç¨ç¦æ¢è§åã
为äºé²æ¢è¦æ¥ç¦æ¢èªèº«ï¼ä¸è§åçç®æ åæºç«¯ é½ å¹é çè¦æ¥ä¸è½è¢«è¦æ¥ï¼å æ¬å ¶æ¬èº«ï¼ä¸ºçæ¥ç¦æ¢ãä½æ¯ï¼æ们建议éæ©ç®æ å¹é å¨åæºå¹é å¨ï¼ä»¥ä½¿è¦æ¥æ°¸è¿ä¸ä¼åæ¶å¹é åæ¹ãè¿å¾å®¹æè¿è¡æ¨çï¼å¹¶ä¸ä¸ä¼è§¦åæ¤ç¹æ®æ åµã
æ¥çæ¯è§årules
ä¸è§£éäºï¼èªå·±ç 究å®æ¹ææ¡£
alertmanagerçé容å¨å®è£ æ¹å¼æ¯
wget /prometheus/alertmanager/releases/download/v0..0/alertmanager-0..0.linux-amd.tar.gz
tar xf alertmanager-0..0.linux-amd.tar.gz
mv alertmanager-0..0.linux-amd /usr/local/alertmanager
vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager
Documentation=/prometheus/alertmanager
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
Alertmanager å®è£ ç®å½ä¸é»è®¤æ alertmanager.yml é ç½®æ件ï¼å¯ä»¥å建æ°çé ç½®æ件ï¼å¨å¯å¨æ¶æå®å³å¯ã
å ¶ä½æ¹å¼åä¸é¢ä¸æ ·
æ¥çæ¯Prometheusï¼æä¹åçå客éæåäºå®¹å¨å®è£ åé容å¨å®è£ çæ¹æ³ï¼èªå·±å»ç¿»é
ç¶åæ¯å¨prometheus.ymléä¿®æ¹ç¸å ³é ç½®
é¦å å»æalertmanagerç注éï¼æ¹æIPå ä½ è®¾ç½®ç端å£å·ï¼é»è®¤æ¯
æ¥çå¨rule_files: ä¸é¢åä¸è§åæ件çç»å¯¹è·¯å¾ï¼å¯ä»¥æ¯å ·ä½æ件åï¼ä¹å¯ä»¥æ¯*ï¼ä¹å¯ä»¥åå 级æ件ï¼*é»è®¤æ¯å ¨é¨å¹é
æ¥çæ¯è¢«çæ§é¡¹ç设置ï¼è¿é设置å®æå¯ä»¥å¨Prometheusç½é¡µéçtargetséçå¾å°
请注æï¼è¿é设置çåæ°ååè¦åruleè§åä¸è®¾ç½®çåæ°ååä¸æ¨¡ä¸æ ·ï¼å¦åä½ çprometheusæå¡ä¼æ æ³å¯å¨ï¼ç¶åæ¥é
å¦æä¸å¨ç¹å®çjobä¸è®¾ç½®scrape_intervalï¼ä¼å 级é«äºå ¨å±ï¼,åé»è®¤éç¨gobalä¸çscrape_interval
æå模æèç¹æ线ï¼æå¨å ³énode-exporteræè Cadvisor
docker stop node-exporter æè 容å¨ID
docker stop cadvisor æè 容å¨ID
æè æup{ { job='prometheus'}} == 1 设置æ1ï¼åå设置ï¼ä¸ç¨å ³ææå¡ï¼å°±å¯ä»¥ççåè¦æä¸æå
说æä¸ä¸ Prometheus Alert åè¦ç¶ææä¸ç§ç¶æï¼InactiveãPendingãFiringã
Inactiveï¼éæ´»å¨ç¶æï¼è¡¨ç¤ºæ£å¨çæ§ï¼ä½æ¯è¿æªæä»»ä½è¦æ¥è§¦åã
Pendingï¼è¡¨ç¤ºè¿ä¸ªè¦æ¥å¿ 须被触åãç±äºè¦æ¥å¯ä»¥è¢«åç»ãåæ/æå¶æéé»/éé³ï¼æ以çå¾ éªè¯ï¼ä¸æ¦ææçéªè¯é½éè¿ï¼åå°è½¬å° Firing ç¶æã
Firingï¼å°è¦æ¥åéå° AlertManagerï¼å®å°æç §é ç½®å°è¦æ¥çåéç»æææ¥æ¶è ãä¸æ¦è¦æ¥è§£é¤ï¼åå°ç¶æè½¬å° Inactiveï¼å¦æ¤å¾ªç¯ã
没æé ç½®åè¦æ¨¡æ¿æ¶çé»è®¤åè¦æ ¼å¼æ¯è¿æ ·ç
èç¹æ¢å¤åé®ä»¶åç¥æ¯è¿æ ·ç
åäºæ¨¡æ¿åæ¯è¿æ ·ç
è¿è¦éæ°æ å°æ¨¡æ¿æ件夹路å¾å°alertmanager容å¨éçç¸å¯¹è·¯å¾ï¼ç¶åéå¯alertmanagerï¼å½ç¶ï¼å¦æç®å½ä¸æ²¡æ模æ¿æ件ï¼åä¸æ¾ç¤º
åè¦æ¨¡æ¿
å¨alertmanager.ymlä¸ä¿®æ¹ç¸å ³è®¾ç½®
éå¯alertmanager
docker restart alertmanager
æç»ææä¸æ¯å¾å¥½
ntpdate失败报错“the NTP socket is in use, exiting”
今天,我被老大要求处理产品部署失败的问题。产品是云容器平台,部署中遇到了同步时间的挑战。代码调用ntpdate,但遇到报错“the NTP socket is in use, exiting”。我首先尝试搜索解决方案,发现在停用ntpd服务后问题得以解决。然而,为了解决根本问题,我深入研究了ntpdate的源码。
通过访问ntpdate的官方网站并查看源码下载地址,我了解到ntpdate的代码实际上在GitHub上。这表明,使用ntpdate时应直接获取其源代码,而非依赖旧版本。
在源码中,我找到了导致错误的NTP socket使用的端口号是。通过查阅代码,我发现此端口号是硬编码的,这表明作者在设计时可能并未考虑到代码的可维护性。
为了定位到端口号被占用的进程,我检查了当前服务器上的所有进程。结果发现,进程与ntpd服务相关联,且该进程由父进程1启动。通过进一步的排查,我确定了正是ntpd服务占用了端口号。
最终,我关闭了ntpd服务,从而解决了ntpdate失败的问题。这个过程虽然解决了当前问题,但更重要的是,它提供了面对类似情况时的思考方式和解决策略。下次遇到类似问题时,我们就可以根据所学方法,快速定位并解决端口占用的问题。
ntpdc命令如何在交互模式下执行对等体列表操作?
ntpdc 是一个强大的工具,专门用于监控和管理 NTP 服务(ntpd)的状态。它采用源代码中定义的 NTP mode 7 控制消息格式,支持交互式操作和命令行参数输入。通过 ntpdc,用户可以获取丰富的状态和统计信息,包括配置选项,这些选项在 ntpd 启动时以及运行时都能进行设置。 使用 ntpdc 的基本语法是输入其命令后跟相关参数。以下是几个常见的用法:在远程主机执行特定命令:ntpdc -c command
强制进入交互模式:ntpdc -i
获取对等体列表,显示为点阵数字格式:ntpdc -n
查看服务器已知对等体及其状态:ntpdc -p 和 ntpdc -s,后者提供略有不同的输出格式
通过这些实例,你可以在 Linux 系统中轻松地获取和管理 NTP 服务的相关信息。无论是实时监控还是配置调整,ntpdc 都是 NTP 管理不可或缺的实用程序。linux C/C++实现同步NTP时间
在Linux C/C++中,实现同步NTP时间涉及时间类型和相关函数的使用,以及NTP服务器的请求和系统时间的更新。
首先,理解时间类型至关重要。在程序中,我们通常会遇到本地时间(locale time)、格林威治标准时间(GMT, UTC)和世界标准时间(UTC),这些时间以秒为单位,自年1月1日::起计算。例如,通过time()函数获取的秒,通过ctime()函数可以转换为'Fri Oct :: '这样的格式。
对于获取时间,Linux提供了多种函数,如UTC用time()、asctime()和gmtime(),而经时区转换后的本地时间则用ctime()和localtime()。进一步理解这些函数的差异和用法,可以参考相关博客。
实现NTP同步的步骤包括:发送一个NTP请求报文,从选定的NTP服务器,如...(国家授时中心)获取时间。对于系统时间的更新,通常需要root权限,但可以通过设置程序的UID(如使用chmod u+s)来让普通用户也能执行需要root权限的操作,如settimeofday(&tv, NULL)。
如果你想要深入学习Linux C/C++,可以考虑零声教c/c++项目的白金卡课程,它提供实战项目的指导,帮助你打通c++技术方向,包括5大实战项目,确保简历中的项目丰富。课程包括5天答疑服务和学习周期内全额退款保障,报名后可获取源码和其他学习资料。