作者:Alexandra Hoffer URL:http://www.cprogramming.com/gdbtutorial.html
翻译: Hiram Lee
GDB (GNU Debugger的简写)是可以用于C和C++的一款强大的调试工具。调试器这个程序可以让你在程序 运行时检查程序状况来找出错误。你可以看看源代码,观察变量,跟随控制流程,在一个有限的循环中设一个断点,还有更多可以做的事。本文快速介绍一下GDB最常用和最有用的命令和技巧。
开始
要使用GDB调试程序,只需在提示符后键入GDB<程序名字>,你也可先开启GDB,然后如果你有一个发调试的core dump文件的话,可以这样写load<程序名字>。当做完这些时,输入run就可以运行程序了。你可以输入C(表示控制)来与程序交互,这个C会出现在GDB的界面上。输入continue可以从GDB返回到你的程序。GDB中的所有命令都可以缩写为一个独一无二的字母,即它的首字母。因此只需输入c来代替continue。如果你感到困惑的话,GDB有一个内置的帮助系统可以给你演示你可以用GDB做的所有一切和如何做。在提示符下输入help就可进入。一旦你找到你的bug,按control_Dgo 退出GDB。 啥时运行几个GDB会立即让你不解,所确保一次只运行一个GDB程序。
查看
在GDB提示符下有两类命令你可以使用。一种命令是告诉GDB如何做,别一种只是让它给你信息。这小节我们讨论后一种命令。你可以输入print <变量>让GDB告诉你变量的值,这种命令就好像是在C或着C++中运行的一样,举个例子,你可以输入print myarray[5]来查看一个矩阵中特定的元素,或着输入print struc.label来查看一个结构体的成员。
Lisat是另一种有用的命令,它告诉你你在哪,它会给出附近的几行代码。你再输入list,会看到下10行的代码。你可以输入list<行号>来查看某个特定部分的程序。举例来说,如果你想看20行的程序,输入list20。如果程序有多个源文件,你可输入list<文件名>:<行号>来标明你想发查看的部分。你可以选择使用list<函数名>来检查一个函数的开始。
第三个命令backtrace用于查看程序的堆栈,当输入backtrace时,你可以看到一个还没有返回和被调用的函数的清单,输入up 和down来改变范围,这样就可以看到调用函数的状态了。
断点
使用GDB有很多调试的技巧,但有一些是更学用和更有用的。其中之一就是设置断点,断点是程序运行到某一个地方是自动停止,这样你就可以查看整个程序的状态。设置断点,输入break<行号>。break的语法同list.
和break联合使用的一个非常有用的命令叫next,这个next命令会把程序运行至下一行,然后马上再回到GDB的提示符下。 你也可以给next一个参数,例如next 100,这个程序会在运行完第100个指令时停下来。
命令watch也挺有用,无论变量的值如何改变你都可以观测这个变量和设置断点。然而,设置一个观察点会友让GDB的速度下降很多,困此除非你有自己的unix机器,尽量避免使用。
Messing with
有一组命令虽然不经常使用,这些指令实际上是在程序运行时进行修正。比如指令call会调用一个特殊的函数,set variable指令会把程序的一个变量设置为一个特称的值,,比如set varibale i = 0, Return 这个指令会把当前的函数返回到调用它的函数。
技巧
现在你已经学了这些简洁的命令,如何使用它们呢。 这里有一些常见的调试的问题,这些技巧就用了用武之地。
1 Segfaults and Core Dumps
当你的程序发生这个错误时,怎么办?最简单的办法就是在GDB里运行直到发生了段错误。当程序崩溃时,GDB就会告诉你哪一行出错了。一般是程序中试图要对一些变量进行内存复杂操作时发生的。你可以用bt(或着backtrace)找出你所以栈的位置,再用p来查看变量,观察是否有超出范围或过多临时量的情况。有一个捷径,你用GDB调试你的程序,然后load 文件corefile,这个文件导致了崩溃。
2无限循环
无限循环是一个很难自己找到的错误,但用gdb很简单,在GDB里load程序,运行到循环。点击control_c迫使回到GDB提示符。输入bt,就可以知道现在在哪一行。使用list查看代码,看是否能找到什么引起了循环。如果找不到的话,使用n(或着next)把一次进行一个循环,同时 使用p来查看变量。
3隐晦错误
大部分错误难以简单分类,经常出现的是你的程序给出一些不明显的原因导致 的错误输出,当出现这种问题时有这样一此技巧。一种是当你的程序要求输入时设置一个断点,然后一路next
再观察栈和变量,难保一切都是按预想的进行。如果你认为你的问题是因为鞭一个变量引起的,代码上很难看出,那你就监测变量。
翻译: Hiram Lee
GDB (GNU Debugger的简写)是可以用于C和C++的一款强大的调试工具。调试器这个程序可以让你在程序 运行时检查程序状况来找出错误。你可以看看源代码,观察变量,跟随控制流程,在一个有限的循环中设一个断点,还有更多可以做的事。本文快速介绍一下GDB最常用和最有用的命令和技巧。
开始
要使用GDB调试程序,只需在提示符后键入GDB<程序名字>,你也可先开启GDB,然后如果你有一个发调试的core dump文件的话,可以这样写load<程序名字>。当做完这些时,输入run就可以运行程序了。你可以输入C(表示控制)来与程序交互,这个C会出现在GDB的界面上。输入continue可以从GDB返回到你的程序。GDB中的所有命令都可以缩写为一个独一无二的字母,即它的首字母。因此只需输入c来代替continue。如果你感到困惑的话,GDB有一个内置的帮助系统可以给你演示你可以用GDB做的所有一切和如何做。在提示符下输入help就可进入。一旦你找到你的bug,按control_Dgo 退出GDB。 啥时运行几个GDB会立即让你不解,所确保一次只运行一个GDB程序。
查看
在GDB提示符下有两类命令你可以使用。一种命令是告诉GDB如何做,别一种只是让它给你信息。这小节我们讨论后一种命令。你可以输入print <变量>让GDB告诉你变量的值,这种命令就好像是在C或着C++中运行的一样,举个例子,你可以输入print myarray[5]来查看一个矩阵中特定的元素,或着输入print struc.label来查看一个结构体的成员。
Lisat是另一种有用的命令,它告诉你你在哪,它会给出附近的几行代码。你再输入list,会看到下10行的代码。你可以输入list<行号>来查看某个特定部分的程序。举例来说,如果你想看20行的程序,输入list20。如果程序有多个源文件,你可输入list<文件名>:<行号>来标明你想发查看的部分。你可以选择使用list<函数名>来检查一个函数的开始。
第三个命令backtrace用于查看程序的堆栈,当输入backtrace时,你可以看到一个还没有返回和被调用的函数的清单,输入up 和down来改变范围,这样就可以看到调用函数的状态了。
断点
使用GDB有很多调试的技巧,但有一些是更学用和更有用的。其中之一就是设置断点,断点是程序运行到某一个地方是自动停止,这样你就可以查看整个程序的状态。设置断点,输入break<行号>。break的语法同list.
和break联合使用的一个非常有用的命令叫next,这个next命令会把程序运行至下一行,然后马上再回到GDB的提示符下。 你也可以给next一个参数,例如next 100,这个程序会在运行完第100个指令时停下来。
命令watch也挺有用,无论变量的值如何改变你都可以观测这个变量和设置断点。然而,设置一个观察点会友让GDB的速度下降很多,困此除非你有自己的unix机器,尽量避免使用。
Messing with
有一组命令虽然不经常使用,这些指令实际上是在程序运行时进行修正。比如指令call会调用一个特殊的函数,set variable指令会把程序的一个变量设置为一个特称的值,,比如set varibale i = 0, Return 这个指令会把当前的函数返回到调用它的函数。
技巧
现在你已经学了这些简洁的命令,如何使用它们呢。 这里有一些常见的调试的问题,这些技巧就用了用武之地。
1 Segfaults and Core Dumps
当你的程序发生这个错误时,怎么办?最简单的办法就是在GDB里运行直到发生了段错误。当程序崩溃时,GDB就会告诉你哪一行出错了。一般是程序中试图要对一些变量进行内存复杂操作时发生的。你可以用bt(或着backtrace)找出你所以栈的位置,再用p来查看变量,观察是否有超出范围或过多临时量的情况。有一个捷径,你用GDB调试你的程序,然后load 文件corefile,这个文件导致了崩溃。
2无限循环
无限循环是一个很难自己找到的错误,但用gdb很简单,在GDB里load程序,运行到循环。点击control_c迫使回到GDB提示符。输入bt,就可以知道现在在哪一行。使用list查看代码,看是否能找到什么引起了循环。如果找不到的话,使用n(或着next)把一次进行一个循环,同时 使用p来查看变量。
3隐晦错误
大部分错误难以简单分类,经常出现的是你的程序给出一些不明显的原因导致 的错误输出,当出现这种问题时有这样一此技巧。一种是当你的程序要求输入时设置一个断点,然后一路next
再观察栈和变量,难保一切都是按预想的进行。如果你认为你的问题是因为鞭一个变量引起的,代码上很难看出,那你就监测变量。
出两个变态的题目,题目很变态,但是都是实战中遇到的真实案例,
1:我写一个程序,既要使用mysql也要使用memcache,
第一行是 mysql_connect,第二行是memcache_connect
换过来写,第一行是memcache_connect,第二行是mysql_connect
caoz发现实践中这两种写法有很大的区别,区别在哪里?
2:我写一个程序,使用了mysql,生成了一个页面最后用 echo $html; 输出
一种写法是
mysql_close();
echo $html;
另一种是
echo $html;
mysql_close();
caoz发现实践中这两种区别很大,区别在哪里?
两个全是实践中发现并调整的案例。
---------------------------------------------半夜黑眼圈更新博客的分割线--------------------------------
caoz写程序不是追求BT的人,caoz经常和工程师强调,不追求极端的技术体现或者技术炫耀,所以,如果读者认为这里的题目是为了所谓的诸如某个写法比某个写法资源开销小一点或者其他什么,那么这真不是caoz的本意。
这两道题都是真实运营环境中遇到的典型案例,典型在哪里呢?就是当你遇到一个系统故障的时候,你怎么分析,怎么思考,怎么判断多种关联因素的影响,所以这个题目答出答不出并不重要,重要的是怎么思考系统彼此的关系。
一个典型的系统故障是, mysql 连接过多,或者说too many connections,这个问题困扰了我们很久,如果这是因为索引导致的,或者因为数据并发请求导致的,定位到原因并不复杂,但是当上述问题解决后,诡异的现象发生了,数据库几乎没有压力,没有阻塞进程,没有慢查询,但是mysql连接很多,而且都是sleep连接。此时,webserver的链接也很多,换句话说,因为php执行阻塞,导致mysql链接无法迅速释放,那么,php为什么会阻塞? 逐个断点分析发现,原来echo耽误了最多时间。
这个事情让caoz涨了点经验,之前从来不会认为echo是一个时间阻塞点(如果你在本机测试,你会认为其时间延迟几乎是0),但是实例跟踪发现,echo实际上在我们的工作环境中,代表的网络传输的过程,换言之,会因为路由,带宽的因素而等待,而此时,mysql的链接还在那里没有释放,是的,看到题目每个人都会想到,mysql_close要放在echo后面,但是为什么echo会耽误时间,很少人会想到。当然,这个也与工作环境有关,caoz只知道我们配置的webserver会有这种情况,是不是存在其他的配置模式,caoz没有实测,不敢乱说,但是这里的经验是,mysql_close放到echo前面,大量的sleep链接会迅速减少。
echo并不耗费太多系统资源,但是会等待网络传输,在高并发的网络环境下,注意这一点对数据库很有好处。
这个问题解决后,mysql健康了很多,但是偶然还会出现链接过多的问题,又困扰了很久,直到有一天,根据用户反馈的一些错误信息,发现memcached服务器有不稳定因素,原来是memcached流量过高产生阻塞,php进程等待链接,导致mysql链接大量等待,这是第一个题目的由来,其实这个题目本身没有标准答案,但是应该有一个意识,当你在一个脚本中同时启动A,B两个链接,那么如果你不能保证这两个链接是必然可靠的(通常是无法保障的),那么后者一旦阻塞,就会导致前者大量链接等待,而前者阻塞,通常不会影响后者。所以,这个答案取决于,哪个链接对你的应用更重要,以及哪个链接有更大的并发支撑性。
两道题说到底就是一个意思,当遇到系统问题和故障的时候,多想想一些关联的因素影响,多思考整个架构响应先后过程的逻辑,数据库连接过多,不一定是数据库造成的,web链接过多,也不一定非要去优化webserver,关联因素可能才是根源,解决了根源,表象才会彻底解决。
来自:http://hi.baidu.com/cpyblwuqdubbvzd/item/7253e0fb3cfa1cee1a111f64
1:我写一个程序,既要使用mysql也要使用memcache,
第一行是 mysql_connect,第二行是memcache_connect
换过来写,第一行是memcache_connect,第二行是mysql_connect
caoz发现实践中这两种写法有很大的区别,区别在哪里?
2:我写一个程序,使用了mysql,生成了一个页面最后用 echo $html; 输出
一种写法是
mysql_close();
echo $html;
另一种是
echo $html;
mysql_close();
caoz发现实践中这两种区别很大,区别在哪里?
两个全是实践中发现并调整的案例。
---------------------------------------------半夜黑眼圈更新博客的分割线--------------------------------
caoz写程序不是追求BT的人,caoz经常和工程师强调,不追求极端的技术体现或者技术炫耀,所以,如果读者认为这里的题目是为了所谓的诸如某个写法比某个写法资源开销小一点或者其他什么,那么这真不是caoz的本意。
这两道题都是真实运营环境中遇到的典型案例,典型在哪里呢?就是当你遇到一个系统故障的时候,你怎么分析,怎么思考,怎么判断多种关联因素的影响,所以这个题目答出答不出并不重要,重要的是怎么思考系统彼此的关系。
一个典型的系统故障是, mysql 连接过多,或者说too many connections,这个问题困扰了我们很久,如果这是因为索引导致的,或者因为数据并发请求导致的,定位到原因并不复杂,但是当上述问题解决后,诡异的现象发生了,数据库几乎没有压力,没有阻塞进程,没有慢查询,但是mysql连接很多,而且都是sleep连接。此时,webserver的链接也很多,换句话说,因为php执行阻塞,导致mysql链接无法迅速释放,那么,php为什么会阻塞? 逐个断点分析发现,原来echo耽误了最多时间。
这个事情让caoz涨了点经验,之前从来不会认为echo是一个时间阻塞点(如果你在本机测试,你会认为其时间延迟几乎是0),但是实例跟踪发现,echo实际上在我们的工作环境中,代表的网络传输的过程,换言之,会因为路由,带宽的因素而等待,而此时,mysql的链接还在那里没有释放,是的,看到题目每个人都会想到,mysql_close要放在echo后面,但是为什么echo会耽误时间,很少人会想到。当然,这个也与工作环境有关,caoz只知道我们配置的webserver会有这种情况,是不是存在其他的配置模式,caoz没有实测,不敢乱说,但是这里的经验是,mysql_close放到echo前面,大量的sleep链接会迅速减少。
echo并不耗费太多系统资源,但是会等待网络传输,在高并发的网络环境下,注意这一点对数据库很有好处。
这个问题解决后,mysql健康了很多,但是偶然还会出现链接过多的问题,又困扰了很久,直到有一天,根据用户反馈的一些错误信息,发现memcached服务器有不稳定因素,原来是memcached流量过高产生阻塞,php进程等待链接,导致mysql链接大量等待,这是第一个题目的由来,其实这个题目本身没有标准答案,但是应该有一个意识,当你在一个脚本中同时启动A,B两个链接,那么如果你不能保证这两个链接是必然可靠的(通常是无法保障的),那么后者一旦阻塞,就会导致前者大量链接等待,而前者阻塞,通常不会影响后者。所以,这个答案取决于,哪个链接对你的应用更重要,以及哪个链接有更大的并发支撑性。
两道题说到底就是一个意思,当遇到系统问题和故障的时候,多想想一些关联的因素影响,多思考整个架构响应先后过程的逻辑,数据库连接过多,不一定是数据库造成的,web链接过多,也不一定非要去优化webserver,关联因素可能才是根源,解决了根源,表象才会彻底解决。
来自:http://hi.baidu.com/cpyblwuqdubbvzd/item/7253e0fb3cfa1cee1a111f64
[他山之石]PHP扩展之网络socket扩展导读
Php/Js/Shell/Go jackxiang 2012-9-8 22:54
没想到在CSDN上看到一个兄弟写的文章成连载了,于是细看了下,发现对PHP的Socket的编码及扩展实现写得不错,建议看下其扩展写法,很有学习教育意义,再就是对Epoll模型的分析很到位,觉得写得都不错,特摘录下Socket这块的PHP扩展代码分析结合其PHP的Soket服务器写法,原文来自:
http://blog.csdn.net/shagoo/article/details/6647961
http://blog.csdn.net/shagoo/article/details/6396089
《Socket深度探究4PHP(一)》和《Socket深度探究4PHP(二)》 Socket 深度探究 4 PHP (三) 应该是写得很有体系的难得一见的不错的好文章。
阅读全文
http://blog.csdn.net/shagoo/article/details/6647961
http://blog.csdn.net/shagoo/article/details/6396089
《Socket深度探究4PHP(一)》和《Socket深度探究4PHP(二)》 Socket 深度探究 4 PHP (三) 应该是写得很有体系的难得一见的不错的好文章。
阅读全文
[实践OK]Linux服务器系统清掉last登录日志管理常用lastlog命令,linux查看用户登陆历史记录。Linux清除用户登录记录和命令历史方法 。
Unix/LinuxC技术 jackxiang 2012-9-3 13:24
背景:在跳板机上连接的信息不想让人知道或者不想让攻击者知道密钥的IP和端口信息,一旦拿到权限后就能知道密钥很麻烦,于是,得把历史记录消除,在secureCRT里面登录其它机器时加上,如何隐藏你的 Linux 的命令行历史。来自:https://linux.cn/article-7575-1.html
Linux服务器系统清掉last登录日志:
#echo ""> /var/log/wtmp 此文件默认打开时乱码的,里面可以看到ip等等信息
https://blog.csdn.net/counsellor/article/details/87082207
lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示**Never logged**。注意需要以root身份运行该命令,例如:
rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000
另外,可加一些参数,例如,"last -u 102"命令将报告UID为102的用户;"last -t 7"命令表示限制为上一周的报告。
以下来自:http://doc.chinaunix.net/linux/201208/2306409.shtml
查看某用户 cat /home/username/.bash_history 的操作历史
使用root登陆使用last -x可查看用户登陆历史。
last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。
语 法:last [-adRx][-f ][-n ][帐号名称…][终端机编号…]
补充说明:单独执行last指令,它会读取位于/var/log目录下,
名称为wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
参 数:
-a 把从何处登入系统的主机名称或IP地址,显示在最后一行。
-d 将IP地址转换成主机名称。
-f 指定记录文件。
-n 或- 设置列出名单的显示列数。
-R 不显示登入系统的主机名称或IP地址。
-x 显示系统关机,重新开机,以及执行等级的改变等信息。
lastlog可简单查看所有用户最后一次的登陆时间
http://blog.163.com/lideren_2008/blog/static/147057920120515235866/
________________Linux清除用户登录记录和命令历史方法摘自上面的URl __________________
清除登陆系统成功的记录
[root@localhost root]# echo > /var/log/wtmp #此文件默认打开时乱码,可查到ip等信息
[root@localhost root]# last #此时即查不到用户登录信息
清除登陆系统失败的记录
[root@localhost root]# echo > /var/log/btmp #此文件默认打开时乱码,可查到登陆失败信息
[root@localhost root]# lastb #查不到登陆失败信息
清除历史执行命令
[root@localhost root]# history -c
或者,清空用户目录下的这个文件即可
[root@localhost root]# echo > ./.bash_history
1.vi /root/history #新建记录文件
2.history -c #清除记录
3.history -r /root/history.txt #导入记录
4.history #查询导入结果
example
[root@localhost root]# vi /root/history
[root@localhost root]# history -c
[root@localhost root]# history -r /root/history.txt
[root@localhost root]# history
1 echo > /var/log/wtmp
2 last
3 echo > /var/log/btmp
4 lastb
5 history -c
6 echo > ./.bash_history
7 history
Linux服务器系统清掉last登录日志:
#echo ""> /var/log/wtmp 此文件默认打开时乱码的,里面可以看到ip等等信息
https://blog.csdn.net/counsellor/article/details/87082207
lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示**Never logged**。注意需要以root身份运行该命令,例如:
rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000
另外,可加一些参数,例如,"last -u 102"命令将报告UID为102的用户;"last -t 7"命令表示限制为上一周的报告。
以下来自:http://doc.chinaunix.net/linux/201208/2306409.shtml
查看某用户 cat /home/username/.bash_history 的操作历史
使用root登陆使用last -x可查看用户登陆历史。
last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。
语 法:last [-adRx][-f ][-n ][帐号名称…][终端机编号…]
补充说明:单独执行last指令,它会读取位于/var/log目录下,
名称为wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
参 数:
-a 把从何处登入系统的主机名称或IP地址,显示在最后一行。
-d 将IP地址转换成主机名称。
-f 指定记录文件。
-n 或- 设置列出名单的显示列数。
-R 不显示登入系统的主机名称或IP地址。
-x 显示系统关机,重新开机,以及执行等级的改变等信息。
lastlog可简单查看所有用户最后一次的登陆时间
http://blog.163.com/lideren_2008/blog/static/147057920120515235866/
________________Linux清除用户登录记录和命令历史方法摘自上面的URl __________________
清除登陆系统成功的记录
[root@localhost root]# echo > /var/log/wtmp #此文件默认打开时乱码,可查到ip等信息
[root@localhost root]# last #此时即查不到用户登录信息
清除登陆系统失败的记录
[root@localhost root]# echo > /var/log/btmp #此文件默认打开时乱码,可查到登陆失败信息
[root@localhost root]# lastb #查不到登陆失败信息
清除历史执行命令
[root@localhost root]# history -c
或者,清空用户目录下的这个文件即可
[root@localhost root]# echo > ./.bash_history
1.vi /root/history #新建记录文件
2.history -c #清除记录
3.history -r /root/history.txt #导入记录
4.history #查询导入结果
example
[root@localhost root]# vi /root/history
[root@localhost root]# history -c
[root@localhost root]# history -r /root/history.txt
[root@localhost root]# history
1 echo > /var/log/wtmp
2 last
3 echo > /var/log/btmp
4 lastb
5 history -c
6 echo > ./.bash_history
7 history
php用system后台运行命令不等待结果的用法
Php/Js/Shell/Go jackxiang 2012-8-31 19:15
system(“nohup ./t.py $ks &”);这个不会在后台运行,php会一直挂起直到t.py结束。
system(“nohup ./t.py $ks >>log.txt &”);这样写才能在后台运行因为system函数启动一个程序并希望保持在后台运行,
必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。
如:
到无穷的黑夜文件中去:
system(“nohup ./t.py $ks >>log.txt &”);这样写才能在后台运行因为system函数启动一个程序并希望保持在后台运行,
必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。
如:
到无穷的黑夜文件中去:
在ATMEL的89S51系列的89S51与89C51功能相同,指令兼容。HEX程序无需任何转换可以直接使用。89S51只比89C51增加了一个看门狗功能。
向看门狗寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H,即可激活看门狗。
汇编程序如下:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
C51程序如下:
在AT89X51.h声明文件中增加一行 sfr WDTRST = 0xA6来声明看门狗寄存器。
sfr WDTRST = 0xA6;
Main()
{
WDTRST=0x1E; //先送1E
WDTRST=0xE1; //后送E1
喂狗指令与激活相同:
WDTRST=0x1E;
WDTRST=0xE1;
注意事项:
1. 89S51的看门狗必须由程序激活后才开始工作。
2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。
3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。
阅读全文
向看门狗寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H,即可激活看门狗。
汇编程序如下:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
C51程序如下:
在AT89X51.h声明文件中增加一行 sfr WDTRST = 0xA6来声明看门狗寄存器。
sfr WDTRST = 0xA6;
Main()
{
WDTRST=0x1E; //先送1E
WDTRST=0xE1; //后送E1
喂狗指令与激活相同:
WDTRST=0x1E;
WDTRST=0xE1;
注意事项:
1. 89S51的看门狗必须由程序激活后才开始工作。
2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。
3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。
阅读全文
严泽远 10:08:42
我用的是STC12C5628AD
回忆未来-向东-Jàck 13:08:22
AT89S52有软件喂狗,但是STC12C5A60S2 单片机有硬件看门狗,用哪个好呢?
张彦欣单片机 13:59:27
AT89S52有看门狗?
回忆未来-向东-Jàck 14:11:23
STC12C5A60S2 这个也需要写代码喂狗?
回忆未来-向东-Jàck 14:13:50
STC12C5A60S2 这个自己带PWM,我用AT89S52的定时器产生也成,但是好像时序有点问题,如果不关中断的话。所以,STC12C5A60S2 感觉要稳定点儿,兄弟怎么看?
张彦欣单片机 14:15:19
是的。
用单片机做的温度监控系统,ds18b20采集温度,现在还要输出PWM波频率为100HZ,应该如何实现?求大神指点
用低定时器中断时不行的,会使ds18b20输出错误,若在ds18b20程序中关中断,pwm波会有断续。
我告诉你为什么:
因为定时器中断是强制性的,一旦计时溢出,无论程序执行到何处都会被暂停,优先去执行中断服务程序。 DS18B20这种对时序有严格要求的单总线通讯,在发送和接收数据时被定时器中断扰乱了时序,所以无法通讯。要解决此问题建议你采用带硬件PWM的MCU,或者将18B20通讯代码放在中断服务程序内部,如果采用后一种方式,PWM计时时间请算上18B20通讯的时间。
这是一定不行的,定时器写的pwm是会破坏18b20的时序的;
如果时间允许序的话,即pwm高(低)电平时间大于读写18b20的时间;我建议你在每个pwm的高(低)电平的时候进行18b20的操作;
若时间不允许的话,那么只能在定时器中加上18b20的读取时间了,这样将会很麻烦;
以上仅供参考。
稍微高级一点的MCU应该带有PWM寄存器吧,STC也有类似40个引脚的增强型的单片机,如:stc12c5a60s2
http://item.taobao.com/item.htm?spm=a230r.1.10.210&id=9929702075
书:“十五”高等院校规划教材:《增强型8051单片机实用开发技术》
好多地都没有货了,直接购买PDF版本:http://item.taobao.com/item.htm?spm=a230r.1.10.86.WziaXb&id=16258074740
百度文库PWM简单代码:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
淘宝上有卖开发板的,找到两家便宜的店:
http://item.taobao.com/item.htm?spm=a230r.1.10.208.JW2dkE&id=14811238438&_u=u19u1s735c
对于PWM输出的硬件设计PPT:http://wenku.baidu.com/view/75758588cc22bcd126ff0ca3.html
这样的设计势必要对应程序:http://wenku.baidu.com/view/f02443bd960590c69ec3760f.html
更简单的PWM设置链接:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
,比如有独立的PWM模块,AT24C04等,和AT系列的单片机不同点在于没有仿真罢了。我遇到这种问题是直接在读取温度时就把中断关闭,不让PWM的中断打扰,读取温度的时间应该很短,影响不大,By:jack
STC12C5A60S2能直接替换STC89C52开发板的上的STC89C52单片机吗?
是40引脚的吧 是的话 应该可以
单片机其他外延模块 LED LCD 蜂鸣器 彩灯之类的 需要单片机来的信号都是TTL信号 单片机的电压变化都是一致的 可以进行替换 芯片只要能实现引脚高低信号电压的一致就没问题
您好:
可以的。STC12C5A60S2和STC89C52引脚兼容,前者只是P0口复用了AD,内部资料多了点。
http://zhidao.baidu.com/question/206521917.html?fr=qrl&cid=93&index=1
STC12C5A60S2开了两路PWM,还能不能开定时器0中断啊
可以的,STC12C5A60S2的PWM是独立的硬件模块,不耗STC12C5A60S2的指令执行,所以可以开定时器0中断以及处理其它任务
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。
一个基础板兼容多种STC和ATMel的单片机板:
http://item.taobao.com/item.htm?spm=a230r.1.10.56.zM593N&id=18138913000
答:支持STC89C52、STC12C5A60S2、AT89C51、AT89C52、AT89S51、AT89S52等最常用的51系列单片机。除此之外,还支持其它40脚的51系列单片机以及ATmega16!STC89C52、STC12C5A60S2可以用串口直接下载程序
DS18B20用N次定时中断读取,比如4MS中断一次,第1次复位18B20,
第2次18B20引脚置高,第3次发出转换命令 搜索器件,并启动,到第40次时再复位18B20,41次引脚置高,42次读取命令,43次读取数据。也就是说读取一次温度,需要中断43次,整个过程都在中断中执行。pwm就可以用中断了,18B20也不会读取错误了。希望对你有帮助。
实时是不行了,这儿可以参考一下时间错位的办法:http://bbs.icbuy.com/thread-57813-1-1.html
STC12C5A60S2单片机双串口,为什么串口1用独立波特率发生器时还要使能定时器(0/1)并允许定时器中断?
串口1波特率可使用定时器1或者独立波特率发生器,使用定时器1时做波特率发生时,你就不能用定时器1了,使用独立波特率发生器时,定时器1得到释放,你可以随时使用;此时你使能定时器(0/1)并允许定时器中断只是为了释放定时器,当然你用不到定时器中断,也可以关掉,对波特率无影响的
STC单片机11.0592晶振实现115200波特率串口通信
在8051系列单片机如:89S51、89C51 这些单片机上,用11.0592M晶振实现115200波特率通信,几乎是不可能的。
如果换了STC单片机,例如在STC12C5A60S2实现115200的高速通信就相当简单了。
因为,STC12单片机有独立的波特率发生器。
#include "STC12C5A60S2.H"
#include "stdio.h"
void init_uart()
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
char putchar (unsigned char i)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
return SBUF;
}
记得头文件加上 stdio.h,然后在代码里实现 putchar 函数,这样你就可以很方便的用 printf函数进行串口输出了。
例如
int hh=0,mm=0,ss=0;
printf("现在的时间:%d:%d:%d\r\n", hh,mm,ss);
是不是串口输出变简单多了。
阅读全文
我用的是STC12C5628AD
回忆未来-向东-Jàck 13:08:22
AT89S52有软件喂狗,但是STC12C5A60S2 单片机有硬件看门狗,用哪个好呢?
张彦欣单片机 13:59:27
AT89S52有看门狗?
回忆未来-向东-Jàck 14:11:23
STC12C5A60S2 这个也需要写代码喂狗?
回忆未来-向东-Jàck 14:13:50
STC12C5A60S2 这个自己带PWM,我用AT89S52的定时器产生也成,但是好像时序有点问题,如果不关中断的话。所以,STC12C5A60S2 感觉要稳定点儿,兄弟怎么看?
张彦欣单片机 14:15:19
是的。
用单片机做的温度监控系统,ds18b20采集温度,现在还要输出PWM波频率为100HZ,应该如何实现?求大神指点
用低定时器中断时不行的,会使ds18b20输出错误,若在ds18b20程序中关中断,pwm波会有断续。
我告诉你为什么:
因为定时器中断是强制性的,一旦计时溢出,无论程序执行到何处都会被暂停,优先去执行中断服务程序。 DS18B20这种对时序有严格要求的单总线通讯,在发送和接收数据时被定时器中断扰乱了时序,所以无法通讯。要解决此问题建议你采用带硬件PWM的MCU,或者将18B20通讯代码放在中断服务程序内部,如果采用后一种方式,PWM计时时间请算上18B20通讯的时间。
这是一定不行的,定时器写的pwm是会破坏18b20的时序的;
如果时间允许序的话,即pwm高(低)电平时间大于读写18b20的时间;我建议你在每个pwm的高(低)电平的时候进行18b20的操作;
若时间不允许的话,那么只能在定时器中加上18b20的读取时间了,这样将会很麻烦;
以上仅供参考。
稍微高级一点的MCU应该带有PWM寄存器吧,STC也有类似40个引脚的增强型的单片机,如:stc12c5a60s2
http://item.taobao.com/item.htm?spm=a230r.1.10.210&id=9929702075
书:“十五”高等院校规划教材:《增强型8051单片机实用开发技术》
好多地都没有货了,直接购买PDF版本:http://item.taobao.com/item.htm?spm=a230r.1.10.86.WziaXb&id=16258074740
百度文库PWM简单代码:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
淘宝上有卖开发板的,找到两家便宜的店:
http://item.taobao.com/item.htm?spm=a230r.1.10.208.JW2dkE&id=14811238438&_u=u19u1s735c
对于PWM输出的硬件设计PPT:http://wenku.baidu.com/view/75758588cc22bcd126ff0ca3.html
这样的设计势必要对应程序:http://wenku.baidu.com/view/f02443bd960590c69ec3760f.html
更简单的PWM设置链接:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
,比如有独立的PWM模块,AT24C04等,和AT系列的单片机不同点在于没有仿真罢了。我遇到这种问题是直接在读取温度时就把中断关闭,不让PWM的中断打扰,读取温度的时间应该很短,影响不大,By:jack
STC12C5A60S2能直接替换STC89C52开发板的上的STC89C52单片机吗?
是40引脚的吧 是的话 应该可以
单片机其他外延模块 LED LCD 蜂鸣器 彩灯之类的 需要单片机来的信号都是TTL信号 单片机的电压变化都是一致的 可以进行替换 芯片只要能实现引脚高低信号电压的一致就没问题
您好:
可以的。STC12C5A60S2和STC89C52引脚兼容,前者只是P0口复用了AD,内部资料多了点。
http://zhidao.baidu.com/question/206521917.html?fr=qrl&cid=93&index=1
STC12C5A60S2开了两路PWM,还能不能开定时器0中断啊
可以的,STC12C5A60S2的PWM是独立的硬件模块,不耗STC12C5A60S2的指令执行,所以可以开定时器0中断以及处理其它任务
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。
一个基础板兼容多种STC和ATMel的单片机板:
http://item.taobao.com/item.htm?spm=a230r.1.10.56.zM593N&id=18138913000
答:支持STC89C52、STC12C5A60S2、AT89C51、AT89C52、AT89S51、AT89S52等最常用的51系列单片机。除此之外,还支持其它40脚的51系列单片机以及ATmega16!STC89C52、STC12C5A60S2可以用串口直接下载程序
DS18B20用N次定时中断读取,比如4MS中断一次,第1次复位18B20,
第2次18B20引脚置高,第3次发出转换命令 搜索器件,并启动,到第40次时再复位18B20,41次引脚置高,42次读取命令,43次读取数据。也就是说读取一次温度,需要中断43次,整个过程都在中断中执行。pwm就可以用中断了,18B20也不会读取错误了。希望对你有帮助。
实时是不行了,这儿可以参考一下时间错位的办法:http://bbs.icbuy.com/thread-57813-1-1.html
STC12C5A60S2单片机双串口,为什么串口1用独立波特率发生器时还要使能定时器(0/1)并允许定时器中断?
串口1波特率可使用定时器1或者独立波特率发生器,使用定时器1时做波特率发生时,你就不能用定时器1了,使用独立波特率发生器时,定时器1得到释放,你可以随时使用;此时你使能定时器(0/1)并允许定时器中断只是为了释放定时器,当然你用不到定时器中断,也可以关掉,对波特率无影响的
STC单片机11.0592晶振实现115200波特率串口通信
在8051系列单片机如:89S51、89C51 这些单片机上,用11.0592M晶振实现115200波特率通信,几乎是不可能的。
如果换了STC单片机,例如在STC12C5A60S2实现115200的高速通信就相当简单了。
因为,STC12单片机有独立的波特率发生器。
#include "STC12C5A60S2.H"
#include "stdio.h"
void init_uart()
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
char putchar (unsigned char i)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
return SBUF;
}
记得头文件加上 stdio.h,然后在代码里实现 putchar 函数,这样你就可以很方便的用 printf函数进行串口输出了。
例如
int hh=0,mm=0,ss=0;
printf("现在的时间:%d:%d:%d\r\n", hh,mm,ss);
是不是串口输出变简单多了。
阅读全文
转自老乡的博客:http://www.toplee.com/blog/615.html
很多人用Editplus, 但是修改了文件后,需要切换到文件目录,点击鼠标右键使用TortoiseSVN的提交菜单项来提交,需要增加很多鼠标点击和确认的操作,对于频繁修改的文件来说,非常麻烦,今天研究了一番,找到个好的解决办法:
先下载 http://www.sliksvn.com/pub/Slik-Subversion-1.5.2-win32.msi 安装上,这是一个在windows上提供标准svn命令行的工具,使用默认安装到C盘的相应目录下即可。阅读全文
很多人用Editplus, 但是修改了文件后,需要切换到文件目录,点击鼠标右键使用TortoiseSVN的提交菜单项来提交,需要增加很多鼠标点击和确认的操作,对于频繁修改的文件来说,非常麻烦,今天研究了一番,找到个好的解决办法:
先下载 http://www.sliksvn.com/pub/Slik-Subversion-1.5.2-win32.msi 安装上,这是一个在windows上提供标准svn命令行的工具,使用默认安装到C盘的相应目录下即可。阅读全文
如今tornadoweb和nginx事相当流行的web服务器,很多指标都显示在大多数情况下,他们比apache的性能要好很多。既然如此,我就有以下问题:
Epoll模型是导致他们如此快速的根本原因吗?如果我想写一个好的socket服务器,我能够从中学到什么东西呢?
如果你想写一个socket服务器,建议先看看dan kegel几年前写的c10k文章
http://www.kegel.com/c10k.html
我也认为beej的《网络编程指导》也是一本非常方便实用的书籍
http://beej.us/guide/bgnet/
如果,你需要更多的参考,W. Richard stevens写的《unix网络编程也是一本很好的书籍。
总之,要回答那个问题,apache和nginx最大的不同是,apache使用了每个请求一个线程的阻塞I/O模型,nginx使用了单线程的非阻塞I/O模型。Apache的工作池的确是缩减了一些启动内容并销毁了一些进程,但是在处理多请求的时候他仍然让CPU在不同的线程间跳来跳去。Nginx却把所有的请求都放在一个线程里面。当有一个请求想要发送网络请求的时候,nginx向后端求求附加一个回调,然后再一个新的活跃客户端请求上工作。事实上,这意味着他返回到时间循环(epoll,kqueue,或者是select)然后后请求文件描述符,并告知有些事情要报告。注意,系统调用在主要时间循环里面实际上是一个阻塞操作,因为直到文件描述符可以读写之前是无事可做的。
所以,nginx和ternado如此高效同时服务多个客户端请求的主要原因是:只有一个进程(因此也就剩内存)只有一个线程(因为也就减少了CUP在不同的上下文里面交换)。至于epool,他只是select的另一个更加高级的版本。如果有N个打开的文件描述符(sockets),他就会让你从中选择一个按0(1)的时间复杂度而不是0(N)的时间复杂度进行读操作。事实上,如果你在编译的时候使用了—with-select_module参数,你就可以使用select模型,我敢打赌,那笔apche更加的高效。我对apache的内核不是很熟悉,但是一个快速的grep操作可以告诉我们apache的确是使用了select和epoll模型—可能当服务器在监听多端口/接口的时候,或者他确实有多个为一个客户端请求准备了多了后端请求。
偶尔,我照着这个开始编写一个基本的socket服务器,想要搞清楚为什么nginx是如此的高效。在熟读了nginx的源代码然后又看完了上面的链接中的那些书籍之后,我发现,写一个nginx的模块要比写自己的服务器简单的多。因此也就诞生了一个nginx模块开发指南
http://www.evanmiller.org/nginx-modules-guide.html
(注意,这本指导是针对nginx0.5-0.6编写的,现在有些api已经变化了)如果你做一些与http关的事情,我说你的确应该支持一下nginx因为他把那些愚蠢客户端的请求处理的是如此之好。例如,我自己业余写的一个socket服务器在大多数客户端下都很好出了safari浏览器,我到现在都没搞清楚这是怎么回事。即使在其他的协议下,nginx也能适应,nginx的事物处理能力已经完全对协议层透明,这就是为什么他技能代理http,也能代理imap.ngingx的核心代码组织的相当好,写的也相当优秀,唯一的缺陷是几乎没有什么注释。我不会在被nginx牵着鼻子走,当他和一个协议解释器纠缠不清的时候。相反,使用一个解释生成器。我写了一些关于在nginx中使用解释生成器的东西在下面这给对方:
http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing
这可能比你想要的信息要多,不过我还是希望你能找到一些对你有用的东西
Epoll模型是导致他们如此快速的根本原因吗?如果我想写一个好的socket服务器,我能够从中学到什么东西呢?
如果你想写一个socket服务器,建议先看看dan kegel几年前写的c10k文章
http://www.kegel.com/c10k.html
我也认为beej的《网络编程指导》也是一本非常方便实用的书籍
http://beej.us/guide/bgnet/
如果,你需要更多的参考,W. Richard stevens写的《unix网络编程也是一本很好的书籍。
总之,要回答那个问题,apache和nginx最大的不同是,apache使用了每个请求一个线程的阻塞I/O模型,nginx使用了单线程的非阻塞I/O模型。Apache的工作池的确是缩减了一些启动内容并销毁了一些进程,但是在处理多请求的时候他仍然让CPU在不同的线程间跳来跳去。Nginx却把所有的请求都放在一个线程里面。当有一个请求想要发送网络请求的时候,nginx向后端求求附加一个回调,然后再一个新的活跃客户端请求上工作。事实上,这意味着他返回到时间循环(epoll,kqueue,或者是select)然后后请求文件描述符,并告知有些事情要报告。注意,系统调用在主要时间循环里面实际上是一个阻塞操作,因为直到文件描述符可以读写之前是无事可做的。
所以,nginx和ternado如此高效同时服务多个客户端请求的主要原因是:只有一个进程(因此也就剩内存)只有一个线程(因为也就减少了CUP在不同的上下文里面交换)。至于epool,他只是select的另一个更加高级的版本。如果有N个打开的文件描述符(sockets),他就会让你从中选择一个按0(1)的时间复杂度而不是0(N)的时间复杂度进行读操作。事实上,如果你在编译的时候使用了—with-select_module参数,你就可以使用select模型,我敢打赌,那笔apche更加的高效。我对apache的内核不是很熟悉,但是一个快速的grep操作可以告诉我们apache的确是使用了select和epoll模型—可能当服务器在监听多端口/接口的时候,或者他确实有多个为一个客户端请求准备了多了后端请求。
偶尔,我照着这个开始编写一个基本的socket服务器,想要搞清楚为什么nginx是如此的高效。在熟读了nginx的源代码然后又看完了上面的链接中的那些书籍之后,我发现,写一个nginx的模块要比写自己的服务器简单的多。因此也就诞生了一个nginx模块开发指南
http://www.evanmiller.org/nginx-modules-guide.html
(注意,这本指导是针对nginx0.5-0.6编写的,现在有些api已经变化了)如果你做一些与http关的事情,我说你的确应该支持一下nginx因为他把那些愚蠢客户端的请求处理的是如此之好。例如,我自己业余写的一个socket服务器在大多数客户端下都很好出了safari浏览器,我到现在都没搞清楚这是怎么回事。即使在其他的协议下,nginx也能适应,nginx的事物处理能力已经完全对协议层透明,这就是为什么他技能代理http,也能代理imap.ngingx的核心代码组织的相当好,写的也相当优秀,唯一的缺陷是几乎没有什么注释。我不会在被nginx牵着鼻子走,当他和一个协议解释器纠缠不清的时候。相反,使用一个解释生成器。我写了一些关于在nginx中使用解释生成器的东西在下面这给对方:
http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing
这可能比你想要的信息要多,不过我还是希望你能找到一些对你有用的东西
在Vmware的虚拟机上想通过yum等更新下rpm,于是自己ping 一下却发现没有出得去,采用的是桥连的方法:
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
From 192.168.1.108 icmp_seq=1 Destination Host Unreachable
From 192.168.1.108 icmp_seq=2 Destination Host Unreachable
From 192.168.1.108 icmp_seq=3 Destination Host Unreachable
From 192.168.1.108 icmp_seq=5 Destination Host Unreachable
原来一看是网关没有设好:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT="yes"
DEVICE="eth0"
BOOTPROTO="static"
IPADDR=192.168.1.108
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
GATEWAY=192.168.1.254,后修改为:GATEWAY=192.168.1.1,发现这个192.168.1.1是集成了:DNS,网关,DHCP服务于一体的一个东东,这个东东也就是我买的那个无线路由器的Ip,修改后出现新的现象:
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
但用:curl "www.jackxiang.com" 是Ok的,于是查了下google如下,问题是为何出现:DUP!这个玩意?不明白啊,尽管有下面的解释,还是不太明白到底是为什么:
这个是个ICMP重定向应答,ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发
请解释网关和域名服务器的作用:
为何刚才设置错了网关就不行呢?看来得对网关这个玩意有所了解,如下知识汇总:阅读全文
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
From 192.168.1.108 icmp_seq=1 Destination Host Unreachable
From 192.168.1.108 icmp_seq=2 Destination Host Unreachable
From 192.168.1.108 icmp_seq=3 Destination Host Unreachable
From 192.168.1.108 icmp_seq=5 Destination Host Unreachable
原来一看是网关没有设好:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT="yes"
DEVICE="eth0"
BOOTPROTO="static"
IPADDR=192.168.1.108
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
GATEWAY=192.168.1.254,后修改为:GATEWAY=192.168.1.1,发现这个192.168.1.1是集成了:DNS,网关,DHCP服务于一体的一个东东,这个东东也就是我买的那个无线路由器的Ip,修改后出现新的现象:
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
但用:curl "www.jackxiang.com" 是Ok的,于是查了下google如下,问题是为何出现:DUP!这个玩意?不明白啊,尽管有下面的解释,还是不太明白到底是为什么:
这个是个ICMP重定向应答,ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发
请解释网关和域名服务器的作用:
为何刚才设置错了网关就不行呢?看来得对网关这个玩意有所了解,如下知识汇总:阅读全文
[值得参考]用php+snmp实现服务器监控程序,Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形解决方案。
Php/Js/Shell/Go jackxiang 2012-8-21 15:07
Cacti基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测
官方网站:http://www.cacti.net/
演示地址:http://www.cacti.net/screenshots.php
下载地址:http://www.cacti.net/download_cacti.php
文章来源:http://www.OSphp.com.cn
程序介绍:
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形解决方案。Cacti通过snmpget来获取数据,使用RRDtool绘画图形,也可外挂Scripts及加上Templates来作出各式各样的监控图,而且你完全可以不需要了解RRDtool复杂的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善,界面友好,支持插件扩展。
转载自 xiaoxiaolq最终编辑 xiaoxiaolq值班监控服务器时,需一台台去登录查看服务器情况,很是麻烦,故用PHP SNMP做了个简单的服务器监控系统。结合了用来发短信的MAS系统,当服务器反生异常时可通过短信进行报警。阅读全文
官方网站:http://www.cacti.net/
演示地址:http://www.cacti.net/screenshots.php
下载地址:http://www.cacti.net/download_cacti.php
文章来源:http://www.OSphp.com.cn
程序介绍:
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形解决方案。Cacti通过snmpget来获取数据,使用RRDtool绘画图形,也可外挂Scripts及加上Templates来作出各式各样的监控图,而且你完全可以不需要了解RRDtool复杂的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善,界面友好,支持插件扩展。
转载自 xiaoxiaolq最终编辑 xiaoxiaolq值班监控服务器时,需一台台去登录查看服务器情况,很是麻烦,故用PHP SNMP做了个简单的服务器监控系统。结合了用来发短信的MAS系统,当服务器反生异常时可通过短信进行报警。阅读全文
在WINDOWS7系统下,使用以前Xp的快捷键win+u+u关机不行了?告诉你个新方法,操作键数和次数一样,好用的要尖叫。
更高明的办法:win + -> +回车!这个办法和XP一样,只需要3次操作!
更高明的办法:win + -> +回车!这个办法和XP一样,只需要3次操作!
[实践Ok]开机自动启动samba
Unix/LinuxC技术 jackxiang 2012-8-18 18:28
service nmb start
service nscd start
1. 在 /etc/init.d 中作一个如下内容的脚本smbd
一般要封装一下:
2. 然后执行
ln -s /etc/init.d/smbd /etc/rc3.d/S99smbd
ln -s /etc/init.d/smbd /etc/rc0.d/K01smbd
3.测试一下及赋权限:
开机启动:
service smbd start
env: /etc/init.d/smbd: 权限不够
chmod -R a+x /etc/init.d/smbd
service nscd start
1. 在 /etc/init.d 中作一个如下内容的脚本smbd
一般要封装一下:
2. 然后执行
ln -s /etc/init.d/smbd /etc/rc3.d/S99smbd
ln -s /etc/init.d/smbd /etc/rc0.d/K01smbd
3.测试一下及赋权限:
开机启动:
service smbd start
env: /etc/init.d/smbd: 权限不够
chmod -R a+x /etc/init.d/smbd
[实践Ok]让Samba支持软连接,方便开发的实践操作。
Unix/LinuxC技术 jackxiang 2012-8-18 18:24
今天,自己搭建一个samba时,想建立一个软链接,但发现报错:
查来查去,原来是少了一行:unix extensions = no ,少这一行,能看见软链接,但点不进去,说是权限不够。
也就是需要三行配置,如下:
samba的conf代码:
查来查去,原来是少了一行:unix extensions = no ,少这一行,能看见软链接,但点不进去,说是权限不够。
也就是需要三行配置,如下:
samba的conf代码:
PHP下一个不错的Excel类:PHP类phpExcel应用
Php/Js/Shell/Go jackxiang 2012-8-18 10:08
PHP语言在实际编写中经常会与数据库打上交道。下面我们就来一起看看PHP类phpExcel的具体使用方法。phpExcel,操作excel很方便,尤其是可以方便的加入图片,支持jpg gif png格式。
下面是总结的几个PHP类phpExcel使用方法
创建一个excel
$objPHPExcel = new PHPExcel();
PHP类phpExcel保存excel—2007格式
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter=new PHPExcel_Writer_Excel5($objPHPExcel);//非2007格式
$objWriter->save("xxx.xlsx");
直接输出到浏览器
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.xls" ');
header("Content-Transfer-Encoding:binary");
$objWriter->save("php://output");
PHP类phpExcel设置excel的属性:
阅读全文
下面是总结的几个PHP类phpExcel使用方法
创建一个excel
$objPHPExcel = new PHPExcel();
PHP类phpExcel保存excel—2007格式
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter=new PHPExcel_Writer_Excel5($objPHPExcel);//非2007格式
$objWriter->save("xxx.xlsx");
直接输出到浏览器
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.xls" ');
header("Content-Transfer-Encoding:binary");
$objWriter->save("php://output");
PHP类phpExcel设置excel的属性:
阅读全文
php文件锁(转)
Php/Js/Shell/Go jackxiang 2012-8-18 09:55
锁:这种在脚本重复跑,加上文件锁是最有效的方法,以下介绍Php的文件锁使用方法。
阅读全文
阅读全文
点评:Mysql的;group_concat这个函数在PHP和Mysql结合的优化上可能在某些时候能够派上用场,如下:
Group_Concat 是 MySQL 中用户Group By 的一个函数,函数语法如下:
这个函数在 MySQL 4.1 中被加入。函数返回一个字符串结果,该结果由分组中的值连接组合而成。
充分利用此函数,可以简化我们程序中的一些写法。
比如我们现在有一个学生成绩表,为了方便不同班级科目的设置,对学生的成绩没有采用一条记录多个字段的方式,而是采用多条记录一个成绩字段方式存储。
现在要求获得一个班级中学生各科成绩列表。
通过Group_Concat 函数,我们只要简单执行如下的SQL语句,
然后在程序中通过一个循环,将选出的结果输出来就可以了。如果不使用,我们通常需要将选出来的数据做再次整理,(多增加一些变量做一些循环判断,没有采用Group_Concat后的逻辑简单)
来自:http://www.sunnyu.com/?p=160
Group_Concat 是 MySQL 中用户Group By 的一个函数,函数语法如下:
这个函数在 MySQL 4.1 中被加入。函数返回一个字符串结果,该结果由分组中的值连接组合而成。
充分利用此函数,可以简化我们程序中的一些写法。
比如我们现在有一个学生成绩表,为了方便不同班级科目的设置,对学生的成绩没有采用一条记录多个字段的方式,而是采用多条记录一个成绩字段方式存储。
现在要求获得一个班级中学生各科成绩列表。
通过Group_Concat 函数,我们只要简单执行如下的SQL语句,
然后在程序中通过一个循环,将选出的结果输出来就可以了。如果不使用,我们通常需要将选出来的数据做再次整理,(多增加一些变量做一些循环判断,没有采用Group_Concat后的逻辑简单)
来自:http://www.sunnyu.com/?p=160