﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-行进中开火-随笔分类-Linux &amp; QT</title><link>http://www.cppblog.com/sigepluto/category/7798.html</link><description>C++夜未眠</description><language>zh-cn</language><lastBuildDate>Sun, 07 Mar 2010 22:46:56 GMT</lastBuildDate><pubDate>Sun, 07 Mar 2010 22:46:56 GMT</pubDate><ttl>60</ttl><item><title>快速扩展文件大小</title><link>http://www.cppblog.com/sigepluto/archive/2010/03/03/108814.html</link><dc:creator>Jakcie</dc:creator><author>Jakcie</author><pubDate>Wed, 03 Mar 2010 09:57:00 GMT</pubDate><guid>http://www.cppblog.com/sigepluto/archive/2010/03/03/108814.html</guid><wfw:comment>http://www.cppblog.com/sigepluto/comments/108814.html</wfw:comment><comments>http://www.cppblog.com/sigepluto/archive/2010/03/03/108814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sigepluto/comments/commentRss/108814.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sigepluto/services/trackbacks/108814.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在实际的开发过程中，我们可能需要在文件生成时就立即将文件更改为指定的大小，以便于后续简化对文件的并发操作，这一点在各类的下载工具中有很好的体现。<br>具体方法有：lseek或者 truncate，在Windows中，可以选择 _lseek 或者 SetEndOfFile。&nbsp;&nbsp;<a href='http://www.cppblog.com/sigepluto/archive/2010/03/03/108814.html'>阅读全文</a><img src ="http://www.cppblog.com/sigepluto/aggbug/108814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sigepluto/" target="_blank">Jakcie</a> 2010-03-03 17:57 <a href="http://www.cppblog.com/sigepluto/archive/2010/03/03/108814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux中的时间</title><link>http://www.cppblog.com/sigepluto/archive/2009/11/25/101927.html</link><dc:creator>Jakcie</dc:creator><author>Jakcie</author><pubDate>Wed, 25 Nov 2009 12:27:00 GMT</pubDate><guid>http://www.cppblog.com/sigepluto/archive/2009/11/25/101927.html</guid><wfw:comment>http://www.cppblog.com/sigepluto/comments/101927.html</wfw:comment><comments>http://www.cppblog.com/sigepluto/archive/2009/11/25/101927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sigepluto/comments/commentRss/101927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sigepluto/services/trackbacks/101927.html</trackback:ping><description><![CDATA[
<p>&nbsp;&nbsp;&nbsp; 在Windwos中，系统时间的设置很简单，界面操作，通俗易懂。而且设置后，重启，关机都没关系。系统时间会自动保存在Bios的时钟里面，启动计算机的时候，系统会自动在Bios里面取硬件时间，以保证时间的不间断。</p> <p>&nbsp;&nbsp;&nbsp; 但在Linux下，默认情况下，系统时间和硬件时间，并不会自动同步。在Linux运行过程中，系统时间和硬件时间以异步的方式运行，互不干扰。硬件时间的运行，是靠Bios电池来维持，而系统时间，是用CPU tick来维持的。</p> <p>&nbsp;&nbsp;&nbsp; 在系统开机的时候，会自动从Bios中取得硬件时间，设置为系统时间。</p> <p>&nbsp;</p> <p><strong>一.Linux系统时间的设置</strong></p> <p>&nbsp;&nbsp;&nbsp; 在Linux中设置系统时间，可以用date命令：</p> <blockquote> <p>//查看时间</p> <p>[root@localhost ~]# date<br>2008年 12月 12日 星期五 14:44:12 CST</p> <p>//修改时间<br>[root@localhost ~]# date --set "1/1/09 00:01" &lt;== （月/日/年时:分:秒）<br>2009年 01月 01日 星期四 00:01:00 CST </p> <p>//date 有几种时间格式可接受，这样也可以设置时间： </p> <p>[root@localhost ~]# date 012501012009.30&nbsp; &lt;== 月日时分年.秒<br>2009年 01月 25日 星期日 01:01:30 CST</p> <p>&nbsp;</p></blockquote> <p>&nbsp;<strong>二.Linux硬件时间的设置</strong></p> <p>&nbsp;&nbsp;&nbsp; 硬件时间的设置，可以用hwclock或者clock命令。其中，clock和hwclock用法相近，只用一个就 行，只不过clock命令除了支持x86硬件体系外，还支持Alpha硬件体系。</p> <blockquote> <p>//查看硬件时间 可以是用 hwclock ，hwclock --show 或者 hwclock -r</p> <p>[root@localhost ~]# hwclock --show<br>2008年12月12日 星期五 06时52分07秒&nbsp; -0.376932 seconds<br><br>//设置硬件时间 </p> <p>[root@localhost ~]# hwclock --set --date="1/25/09 00:00" &lt;== 月/日/年时:分:秒<br>[root@localhost ~]# hwclock<br>2009年01月25日 星期日 00时00分06秒&nbsp; -0.870868 seconds </p><p>&nbsp;</p></blockquote> <p><strong>三.系统时间和硬件时间的同步</strong></p> <p>&nbsp;&nbsp;&nbsp; 同步系统时间和硬件时间，可以使用hwclock命令。</p> <blockquote> <p>//以系统时间为基准，修改硬件时间</p> <p>[root@localhost ~]# hwclock --systohc &lt;== sys（系统时间）to（写到）hc（Hard Clock）<br>[root@localhost ~]# hwclock -w </p><p>//以硬件时间为基准，修改系统时间</p> <p>[root@localhost ~]# hwclock --hctosys <br>[root@localhost ~]# hwclock -s </p><p>&nbsp;</p></blockquote> <p><strong>四.不同机器之间的时间同步</strong> </p><p>&nbsp;&nbsp;&nbsp; 为了避免主机时间因为长期运作下所导致的时间偏差，进行时间同步(synchronize)的工作是非常必要的。Linux系统下，一般使用ntp服务器来同步不同机器的时间。一台机器，可以同时是ntp服务器和ntp客户机。在网络中，推荐使用像DNS服务器一样分层的时间服务器来同步时间。 </p><p>&nbsp;&nbsp;&nbsp; 同步时间，可以使用ntpdate命令，也可以使用ntpd服务。 </p><p>&nbsp;&nbsp;&nbsp; 使用ntpdate比较简单。格式如下： </p><blockquote> <p>[root@linux ~]# ntpdate [-nv] [NTP IP/hostname]<br>[root@linux ~]# ntpdate 192.168.0.2<br>[root@linux ~]# ntpdate time.ntp.org</p></blockquote> <p>&nbsp;&nbsp;&nbsp; 但这样的同步，只是强制性的将系统时间设置为ntp服务器时间。如果cpu tick有问题，只是治标不治本。所以，一般配合cron命令，来进行定期同步设置。比如，在crontab中添加： </p><blockquote> <p>0 12 * * * * /usr/sbin/ntpdate 192.168.0.1 </p></blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp; 这样，会在每天的12点整，同步一次时间。ntp服务器为192.168.0.1。 </p><p>&nbsp;&nbsp;&nbsp; 使用ntpd服务，要好于ntpdate加cron的组合。因为，ntpdate同步时间，会造成时间的跳跃，对一些依赖时间的程序和服务会造成影响。比如sleep，timer等。而且，ntpd服务可以在修正时间的同时，修正cpu tick。理想的做法为，在开机的时候，使用ntpdate强制同步时间，在其他时候使用ntpd服务来同步时间。 </p><p>&nbsp;&nbsp;&nbsp; 要注意的是，ntpd 有一个自我保护设置: 如果本机与上源时间相差太大, ntpd 不运行. 所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ntpd服务。ntpd服务 运行后, 先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间, 随着误差减小, 逐步增加同步的间隔. 每次跳动, 都会重复这个调整的过程. </p><p>&nbsp; </p><p><strong>五.ntpd服务的设置</strong> </p><p>&nbsp;&nbsp;&nbsp; ntpd服务的相关设置文件如下： </p><blockquote> <p>1./etc/ntp.conf：这个是NTP daemon的主要设文件，也是 NTP 唯一的设定文件。 </p><p>2./usr/share/zoneinfo/:在这个目录下的文件其实是规定了各主要时区的时间设定文件，例如北京地区的时区设定文件在 /usr/share/zoneinfo/Asia/Beijing 就是了。这个目录里面的文件与底下要谈的两个文件(clock 与localtime)是有关系的。 </p><p>3./etc/sysconfig/clock：这个文件其实也不包含在NTP 的 daemon 当中，因为这个是 linux 的主要时区设定文件。每次开机后，Linux 会自动的读取这个文件来设定自己系统所默认要显示的时间。 </p><p>4./etc/localtime：这个文件就是&#8220;本地端的时间配置文件&#8221;。刚刚那个clock 文件里面规定了使用的时间设置文件(ZONE) 为 /usr/share/zoneinfo/Asia/Beijing ，所以说，这就是本地端的时间了，此时， Linux系统就会将Beijing那个文件另存为一份 /etc/localtime文件，所以未来我们的时间显示就会以Beijing那个时间设定文件为准。 </p><p>5. /etc/timezone：系统时区文件 </p><p>&nbsp;</p></blockquote> <p>&nbsp;&nbsp;&nbsp; 下面重点说说 /etc/ntp.conf文件的设置。在 NTP Server 的设定上面，其实最好不要对 Internet 无限制的开放，尽量仅提供您自己内部的 Client 端联机进行网络校时就好。此外， NTP Server 总也是需要网络上面较为准确的主机来自行更新自己的时间啊，所以在我们的 NTP Server 上面也要找一部最靠近自己的 Time Server 来进行自我校正。事实上， NTP 这个服务也是 Server/Client 的一种模式。 </p><blockquote> <p>[root@linux ~]# vi /etc/ntp.conf <br># 1. 关于权限设定部分 <br>#　　 权限的设定主要以 restrict 这个参数来设定，主要的语法为： <br># 　　restrict IP mask netmask_IP parameter <br># 　　其中 IP 可以是软件地址，也可以是 default ，default 就类似 0.0.0.0 <br>#　　 至于 paramter 则有： <br>#　　　ignore　：关闭所有的 NTP 联机服务 <br>#　　　nomodify：表示 Client 端不能更改 Server 端的时间参数，不过，  </p><p>#　　　Client 端仍然可以透过 Server 端来进行网络校时。 <br>#　　　notrust ：该 Client 除非通过认证，否则该 Client 来源将被视为不信任网域 <br>#　　　noquery ：不提供 Client 端的时间查询  </p><p>#　　　notrap ：不提供trap这个远程事件登入  </p><p>#　　如果 paramter 完全没有设定，那就表示该 IP (或网域)&#8220;没有任何限制&#8221;  </p><p>restrict default nomodify notrap noquery　# 关闭所有的 NTP 要求封包 <br>restrict 127.0.0.1　　　 #这是允许本级查询<br>restrict 192.168.0.1 mask 255.255.255.0 nomodify <br>#在192.168.0.1/24网段内的服务器就可以通过这台NTP Server进行时间同步了 <br># 2. 上层主机的设定 <br>#　　要设定上层主机主要以 server 这个参数来设定，语法为：<br>#　　server [IP|HOST Name] [prefer]<br>#　　Server 后面接的就是我们上层 Time Server 啰！而如果 Server 参数 <br>#　　后面加上 perfer 的话，那表示我们的 NTP 主机主要以该部主机来作为 <br>#　　时间校正的对应。另外，为了解决更新时间封包的传送延迟动作， <br>#　　所以可以使用 driftfile 来规定我们的主机 <br>#　　在与 Time Server 沟通时所花费的时间，可以记录在 driftfile&nbsp; <br>#　　后面接的文件内，例如下面的范例中，我们的 NTP server 与&nbsp; <br>#　　cn.pool.ntp.org联机时所花费的时间会记录在 /etc/ntp/drift文件内 <br>server 0.pool.ntp.org  </p><p>server 1.pool.ntp.org  </p><p>server 2.pool.ntp.org  </p><p>server cn.pool.ntp.org prefer  </p><p>#其他设置值，以系统默认值即可  </p><p>server&nbsp; 127.127.1.0&nbsp;&nbsp;&nbsp;&nbsp; # local clock  </p><p>fudge&nbsp;&nbsp; 127.127.1.0 stratum 10  </p><p>driftfile /var/lib/ntp/drift<br>broadcastdelay&nbsp; 0.008<br>keys /etc/ntp/keys</p></blockquote> <p>总结一下，restrict用来设置访问权限，server用来设置上层时间服务器，driftfile用来设置保存漂移时间的文件。 </p><p>&nbsp; </p><p><strong>六.ntp服务的启动与观察</strong> </p><p>在启动NTP服务前，先对提供服务的这台主机手动的校正一次时间咯。（因为启动服务器，端口会被服务端占用，就不能手动同步时间了） </p><p>[root@linux ~] # ntpdate cn.pool.ntp.org </p><p>25 Apr 14:33:51 ntpdate[8310]: step time server 80.85.129.2 offset 6.655976 sec </p><p> 然后，启动ntpd服务： </p><p> [root@linux ~] # service ntpd start </p><p>或 [root@linux ~] # /etc/init.d/ntpd start </p><p> 查看端口： </p><p>[root@linux ~] # netstat -ln|grep 123 </p><p>udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 192.168.228.153:123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:* </p><p>udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:* </p><p>udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:* </p><p>udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 :::123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :::* </p><p>如何确认我们的NTP服务器已经更新了自己的时间呢？ </p><p>[root@linux ~] # ntpstat </p><p>synchronized to NTP server(127.127.1.0) at stratum 11 </p><p>time correct to within 950ms </p><p>polling server every 64 s </p><p>#改指令可列出NTP服务器是否与上层联机。由上述输出结果可知，时间校正约 </p><p>#为950*10(-6)秒。且每隔64秒会主动更新时间。 </p><p>常见的错误： </p><p>25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found </p><p>其实，这不是一个错误。而是由于每次重启NTP服务器之后大约要3－5分钟客户端才能与server建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。 </p><p>[root@linux ~] # ntptrace &#8211;n 127.0.0.1 </p><p>127.0.0.1:stratum 11, offset 0.000000，synch distance 0.950951 </p><p>222.73.214.125：stratum 2，offset &#8211;0.000787，synch distance 0.108575 </p><p>209.81.9.7:stratum 1，offset 0.000028，synch distance 0.00436，refid &#8216;GPS&#8217; </p><p>#这个指令可以列出目前NTP服务器（第一层）与上层NTP服务器（第二层）彼此之间的 </p><p>#关系 </p><p>[root@linux ~] # ntpq &#8211;p </p><p><img alt="" src="http://1843.img.pp.sohu.com.cn/images/blog/2008/9/14/15/21/11d06a131b3g215.jpg" border="0"> </p><p>指令&#8220;ntpq -p&#8221;可以列出目前我们的NTP与相关的上层NTP的状态，以上的几个字段的意义如下： </p><p>remote：即NTP主机的IP或主机名称。注意最左边的符号，如果由&#8220;+&#8221;则代表目前正在作用钟的上层NTP，如果是&#8220;*&#8221;则表示也有连上线，不过是作为次要联机的NTP主机。 </p><p>refid：参考的上一层NTP主机的地址 </p><p>st：即stratum阶层 </p><p>when：几秒前曾做过时间同步更新的操作 </p><p>poll：下次更新在几秒之后 </p><p>reach：已经向上层NTP服务器要求更新的次数 </p><p>delay：网络传输过程钟延迟的时间 </p><p>offset：时间补偿的结果 </p><p>jitter：Linux系统时间与BIOS硬件时间的差异时间 </p><p>&nbsp; </p><p>&nbsp;&nbsp;&nbsp; 最后提及一点，ntp服务，默认只会同步系统时间。如果想要让ntp同时同步硬件时间，可以设置/etc/sysconfig/ntpd 文件。 </p><p>在/etc/sysconfig/ntpd文件中，添加 SYNC_HWCLOCK=yes 这样，就可以让硬件时间与系统时间一起同步。</p><img src ="http://www.cppblog.com/sigepluto/aggbug/101927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sigepluto/" target="_blank">Jakcie</a> 2009-11-25 20:27 <a href="http://www.cppblog.com/sigepluto/archive/2009/11/25/101927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>