针的指针老是给人讲懂了又忘记,忘记了又讲懂了,但是就像是一个橡皮擦一样一直没有真懂,于是还得复习一下。
1.记住两点:
(1)什么样的类型决定去指向什么样的内容,*一般表示取这个变量指向(可能是指针或者首地址)的内容,如:整形的指针指向整形的内容
(2)任何变量都有地址,变量名指向它的内容(指针的内容是地址或者非指针类型内容可能是char int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(存的地址),而按照区地址一般加&的原则来打印指针的时候呢,打印的是指针的地址而不是其内容地址。
实践:
point.c
#include
int main()
{
int a=8;
int *p;
int *p2;
printf("%p\n",&a);
p=&a;
printf("%p\n",p);
printf("%p\n",*p);
p2 = p;
printf("%p\n",p2);
printf("%p\n",p2);
printf("p=%p\n",&p);
printf("p2=%p\n",&p2);
printf("%d\n",*p2);
}
问:如果想打印p指针本身的地址,如何弄?
答:printf("%p",&p);
问:p2=p是如何赋值的?
答:p的指针内容(里面存的是个地址)赋给p2。
问:p,p2存储的内容(地址)相同,它们两个的地址相同?
答:不同,可以通过打印他们的地址:printf("%p",&p); printf("%p",&p2); 来对比一下。
[root@vm0000055 ~]# ./a.out
a=8
a=0xbf8df31c
p=0xbf8df31c
p2=0xbf8df318
*p2=0xbf8df31c
**p2=8
#include
int main()
{
int a=8;
int *p;
int **p2;
p=&a;
p2 = &p;
printf("a=%d\n",a);
printf("&a=%p\n",&a);
printf("p=%p\n",p);
printf("p2=%p\n",p2);
printf("&p2=%p\n",&p2);
printf("*p2=%p\n",*p2);
printf("**p2=%d\n",**p2);
}
[root@vm0000055 ~]# ./a.out
a=8
a=0xbfb3cd7c
p=0xbfb3cd7c
p2=0xbfb3cd78
*p2=0xbfb3cd7c
**p2=8
问:上面程序p2,*p2,**p2有什么区别?
答:printf("p2=%p\n",p2);打印的是p2指针的内容(它的内容是一个整形的指针变量),也就是p的地址&p(也就是指针p的地址,当然这个地址里面存着p的内容)
printf("*p2=%p\n",*p2);,而*p2也就是p的内容(a的地址),前面说过*就是取内容。
printf("**p2=%d\n",**p2);在前面再加一个*,也就是取到了a的地址后,在取到这个地址指向的内容,及时相当于printf("%d",a);
如还不熟悉参考:
yahoo一题目:把一个字符串倒序:
http://blog.5ifd.com/post/1883/
最后呢,版权所有,向东,呵呵!
1.记住两点:
(1)什么样的类型决定去指向什么样的内容,*一般表示取这个变量指向(可能是指针或者首地址)的内容,如:整形的指针指向整形的内容
(2)任何变量都有地址,变量名指向它的内容(指针的内容是地址或者非指针类型内容可能是char int等),取地址一般得加&,可以通过%p打印出来,而指针特殊在他本身内容是地址,为此,打印%p的时候呢,如没有加&是打印的指针的内容(存的地址),而按照区地址一般加&的原则来打印指针的时候呢,打印的是指针的地址而不是其内容地址。
实践:
point.c
#include
int main()
{
int a=8;
int *p;
int *p2;
printf("%p\n",&a);
p=&a;
printf("%p\n",p);
printf("%p\n",*p);
p2 = p;
printf("%p\n",p2);
printf("%p\n",p2);
printf("p=%p\n",&p);
printf("p2=%p\n",&p2);
printf("%d\n",*p2);
}
问:如果想打印p指针本身的地址,如何弄?
答:printf("%p",&p);
问:p2=p是如何赋值的?
答:p的指针内容(里面存的是个地址)赋给p2。
问:p,p2存储的内容(地址)相同,它们两个的地址相同?
答:不同,可以通过打印他们的地址:printf("%p",&p); printf("%p",&p2); 来对比一下。
[root@vm0000055 ~]# ./a.out
a=8
a=0xbf8df31c
p=0xbf8df31c
p2=0xbf8df318
*p2=0xbf8df31c
**p2=8
#include
int main()
{
int a=8;
int *p;
int **p2;
p=&a;
p2 = &p;
printf("a=%d\n",a);
printf("&a=%p\n",&a);
printf("p=%p\n",p);
printf("p2=%p\n",p2);
printf("&p2=%p\n",&p2);
printf("*p2=%p\n",*p2);
printf("**p2=%d\n",**p2);
}
[root@vm0000055 ~]# ./a.out
a=8
a=0xbfb3cd7c
p=0xbfb3cd7c
p2=0xbfb3cd78
*p2=0xbfb3cd7c
**p2=8
问:上面程序p2,*p2,**p2有什么区别?
答:printf("p2=%p\n",p2);打印的是p2指针的内容(它的内容是一个整形的指针变量),也就是p的地址&p(也就是指针p的地址,当然这个地址里面存着p的内容)
printf("*p2=%p\n",*p2);,而*p2也就是p的内容(a的地址),前面说过*就是取内容。
printf("**p2=%d\n",**p2);在前面再加一个*,也就是取到了a的地址后,在取到这个地址指向的内容,及时相当于printf("%d",a);
如还不熟悉参考:
yahoo一题目:把一个字符串倒序:
http://blog.5ifd.com/post/1883/
最后呢,版权所有,向东,呵呵!
知识参考:【网卡配置】 linux netconfig 命令详解,CentOs5.3默认不安装netconfig了,得用setup!
http://blog.5ifd.com/post/1718/
之前用过CentOS5.2 Linux这个操作系统,其实现在使用 CentOS5.3 应该也差不多吧,
但是以一开始使用就觉得有点吃惊,后来发现了和旧版本不一样的东西,
因为开始使用Linux都是配置网络开始的,所以也就是在网络这一块开始发现的,呵呵。
下面我先启动一下 CentOS5.3 , 配置网络方面,很自然就会使用 netconfig 命令,
这个命令在CentOS5.1中就已经不能使用了,不知道5.3中是否还可以使用,
登陆到 CentOS 5.3 中,尝试使用netconfig 是不能使用的,并不奇怪。。。
其次就使用 setup 来配置,觉得有点惊奇,因为5.1版本可以使用的命令,现在不能
使用了。只好使用 system-config-network,阅读全文
http://blog.5ifd.com/post/1718/
之前用过CentOS5.2 Linux这个操作系统,其实现在使用 CentOS5.3 应该也差不多吧,
但是以一开始使用就觉得有点吃惊,后来发现了和旧版本不一样的东西,
因为开始使用Linux都是配置网络开始的,所以也就是在网络这一块开始发现的,呵呵。
下面我先启动一下 CentOS5.3 , 配置网络方面,很自然就会使用 netconfig 命令,
这个命令在CentOS5.1中就已经不能使用了,不知道5.3中是否还可以使用,
登陆到 CentOS 5.3 中,尝试使用netconfig 是不能使用的,并不奇怪。。。
其次就使用 setup 来配置,觉得有点惊奇,因为5.1版本可以使用的命令,现在不能
使用了。只好使用 system-config-network,阅读全文
这是翻译版本,英文原版是linux源码Documentation文件夹下的CodingStyle
一个良好风格的程序看起来直观、美观,便于阅读,还能有助于对程序的理解,特别在代码量比较大情况下更显现编码素质的重要性。相反没有良好的风格的代码读起来难看、晦涩,甚至有时候一个括号没对齐就能造成对程序的曲解或者不理解。我曾经就遇见过这样的情况,花费了很多不必要的时间在程序的上下文对照上,还debug了半天没理解的程序。后来直接用indent -kr -i8给他转换格式来看了。特此转过来一个关于代码风格的帖子分享一下~阅读全文
一个良好风格的程序看起来直观、美观,便于阅读,还能有助于对程序的理解,特别在代码量比较大情况下更显现编码素质的重要性。相反没有良好的风格的代码读起来难看、晦涩,甚至有时候一个括号没对齐就能造成对程序的曲解或者不理解。我曾经就遇见过这样的情况,花费了很多不必要的时间在程序的上下文对照上,还debug了半天没理解的程序。后来直接用indent -kr -i8给他转换格式来看了。特此转过来一个关于代码风格的帖子分享一下~阅读全文
内容:从最简单的程序入手,手把手教你写程序,让同学们拿到一个复杂的程序或者任务,能快速找到切入点,写出程序,再在此基础上优化程序。当拿到一个任务时,不要急于动手写程序,先仔细分析它的以下几个点:
1、它要单片机整体实现什么功能
2、功能细分(模块化),先干什么,再干什么,最后干什么
3、画初步流程图,(把几个模块画出即可)
4、模块之间的分析:一个模块到另一个模块之间,怎么变换,怎么连接(优化流程图)
5、单个模块分析:每个模块要做什么(流程图细化)
6、所有模块结合连接,细化所有流程图
7、分析单个模块每步要用到的方法或者指令
8、总流程图定型
9、纸上写程序,对照流程图分析其可行性,若不可行则返回
10、上机调试,加注释
以上十步,缺一不可(小程序列外)
切记:流程图的确定很重要,需反复修改
大忌:拿到任务,不仔细分析就写程序。即使是小程序,我们也要养成良好的编程习惯,不要一味的追求结果。写小程序可能比别人快,若是大程序,一旦出现思维混乱,或者出现程序调试不出结果,那么你花在调试上的时间,要比别人的多。 !!!!!!磨刀不误砍柴工!!!!!!
程序的优化:属于后期工作,只有调试出来后,才去优化,如果一开始优化和写程序同时进行,一是加重你的思考量,二是出现问题无从下手。无疑增加了写程序的难度。对于一个初学者,写一个程序,本身头脑就处于紧张的状态,思考的问题就很多,如果此时把优化程序也考虑进去,你脑袋的负荷无疑加重,若你头脑精明,你可以把优化的地方,先在纸上记下来,等到调试结果正常,再把你想到的,优化的地方加进去。
1、它要单片机整体实现什么功能
2、功能细分(模块化),先干什么,再干什么,最后干什么
3、画初步流程图,(把几个模块画出即可)
4、模块之间的分析:一个模块到另一个模块之间,怎么变换,怎么连接(优化流程图)
5、单个模块分析:每个模块要做什么(流程图细化)
6、所有模块结合连接,细化所有流程图
7、分析单个模块每步要用到的方法或者指令
8、总流程图定型
9、纸上写程序,对照流程图分析其可行性,若不可行则返回
10、上机调试,加注释
以上十步,缺一不可(小程序列外)
切记:流程图的确定很重要,需反复修改
大忌:拿到任务,不仔细分析就写程序。即使是小程序,我们也要养成良好的编程习惯,不要一味的追求结果。写小程序可能比别人快,若是大程序,一旦出现思维混乱,或者出现程序调试不出结果,那么你花在调试上的时间,要比别人的多。 !!!!!!磨刀不误砍柴工!!!!!!
程序的优化:属于后期工作,只有调试出来后,才去优化,如果一开始优化和写程序同时进行,一是加重你的思考量,二是出现问题无从下手。无疑增加了写程序的难度。对于一个初学者,写一个程序,本身头脑就处于紧张的状态,思考的问题就很多,如果此时把优化程序也考虑进去,你脑袋的负荷无疑加重,若你头脑精明,你可以把优化的地方,先在纸上记下来,等到调试结果正常,再把你想到的,优化的地方加进去。
我从小就有很强的好奇心和动手能力,想知道每一件东西是如何工作的,对自然科学非常着迷。我还记得,小学时在课堂上用钉子和电线做电磁铁被批评;初中画电路图做收音机被同学取笑;高中被禁止做一种能开所有教室门锁的万能钥匙。我父亲是一名中学物理教师,他的实验室是我那时的天堂。
小时候最大的乐趣是拆装东西。从玩具,闹钟到收音机,凡是能拆的就拆,拆了再装起来。当然,拆坏过不少。不知什么时候起,开始会修了。见过的没见过的,都敢拆开修一修。家电的一般故障,是很简单的。稍微麻烦点元件坏了没有备用的,征得对方同意,我会利用我现有的元件做个替代方案弄上去,也能工作。实在不成,也能告诉对方是什么坏了。
高中时修的东西,大部分是同学们们的单放机收音机之类的。到了大学,我是家电维修与咨询协会的会长,不定期的组织免费维修工作,为同学提供方便。顺便说一句,干这个,可以认识很多平常搭不上话的美眉。人家既感激你,又觉得你很有能耐。其实,我也就是处理了她的单放机的一个虚焊而已。每次放假,还没到家,就有七大姑二大爷的预定,等我去给他们修电视机、电风扇什么的。一直到我有了老婆带回家,才安生了点。
按照自己的兴趣,我大学时选择了物理专业,有了良好的数理基础。平常没事,就泡在图书馆里。艰深的读过数论图论,科普的读过霍金系列。当然,看的最多的是电子和计算机类书籍。
我对电子技术、自动控制这一行,非常热爱。除了图书馆,就是在一位老师的实验室里。这位老师是国内最早搞单片机的一批人之一,现在已经退休了。认识一位好老师真的很重要。他可以不给你上课,但能给你提供一个环境,让你自由自在的发挥,让你的想法变成现实。后来我能力日渐成熟,做了很多公司的项目,也大部分是给那位老师的同学的公司做的。
2002 年我大三,带领另外两个同学获得大学生电子设计大赛一等奖。之后,我开始接手公司的实际项目。不大,但是我独立完成全部工作,如电源电路,芯片选择,驱动,画电路板,51汇编,现场调试等等都做了。然后又做过类似的几个项目。从那以后,开始逐渐深入嵌入式系统的设计。我做的项目包括医疗器械,电动自行车变频控制器,专用表头,计量仪器,工业控制设备,图像处理设备,高频系统等。阅读全文
小时候最大的乐趣是拆装东西。从玩具,闹钟到收音机,凡是能拆的就拆,拆了再装起来。当然,拆坏过不少。不知什么时候起,开始会修了。见过的没见过的,都敢拆开修一修。家电的一般故障,是很简单的。稍微麻烦点元件坏了没有备用的,征得对方同意,我会利用我现有的元件做个替代方案弄上去,也能工作。实在不成,也能告诉对方是什么坏了。
高中时修的东西,大部分是同学们们的单放机收音机之类的。到了大学,我是家电维修与咨询协会的会长,不定期的组织免费维修工作,为同学提供方便。顺便说一句,干这个,可以认识很多平常搭不上话的美眉。人家既感激你,又觉得你很有能耐。其实,我也就是处理了她的单放机的一个虚焊而已。每次放假,还没到家,就有七大姑二大爷的预定,等我去给他们修电视机、电风扇什么的。一直到我有了老婆带回家,才安生了点。
按照自己的兴趣,我大学时选择了物理专业,有了良好的数理基础。平常没事,就泡在图书馆里。艰深的读过数论图论,科普的读过霍金系列。当然,看的最多的是电子和计算机类书籍。
我对电子技术、自动控制这一行,非常热爱。除了图书馆,就是在一位老师的实验室里。这位老师是国内最早搞单片机的一批人之一,现在已经退休了。认识一位好老师真的很重要。他可以不给你上课,但能给你提供一个环境,让你自由自在的发挥,让你的想法变成现实。后来我能力日渐成熟,做了很多公司的项目,也大部分是给那位老师的同学的公司做的。
2002 年我大三,带领另外两个同学获得大学生电子设计大赛一等奖。之后,我开始接手公司的实际项目。不大,但是我独立完成全部工作,如电源电路,芯片选择,驱动,画电路板,51汇编,现场调试等等都做了。然后又做过类似的几个项目。从那以后,开始逐渐深入嵌入式系统的设计。我做的项目包括医疗器械,电动自行车变频控制器,专用表头,计量仪器,工业控制设备,图像处理设备,高频系统等。阅读全文
嘿嘿,关于看门狗的作用,我来讲……
1:要讲系统的可靠性,首先要讲系统安全保证机制的可靠性,对于MCU系统来说,养DOG是其中最重要的一条
2:很多人可能要讲,我没养DOG,我的系统也很可靠,所以看门狗没有必要。
这是一种不需要反驳的观点,从理论上来讲,养狗安全系数肯定会高一些;
3:在系统里面养狗,狗本身电路也是存在失效可能性的,在上面有人曾讲到MAX813翘了,这就属于这种情况,MAX813还属于比较好的,过去很多人经常用到的25045,内部集成了EE等资源,这东西不怎的,很容易被干扰得自己挂了。
4:很多人在争执系统里面应该如何养狗,很多人片面的以为狗一定要在主循环里面养才是最好的,在这里不得不说说hotpower的中断养狗论了,当年 hotpower为了证明那些人的说法是何其错误,整出了一个中断养狗论,很多人根本没看懂hotpower想要表达的真实含义,从原理上讲,hotpower其实要表达的是:要想养一条忠实听话的好狗,在哪个地方养根本不重要,在哪个地方养都可以达到最好的效果,真正重要的是要注意软体返回的各个路径,在异常的时候,要通过条件互驳,让狗起来看家。
5:虽然hotpower中断养狗的方法也可以达到比较好的看家效果,但俺却是一个主循环养狗的坚定拥护者,原因无它,第一:主循环养狗简单明了;第二:主循环养狗比较省代码,第三:不管是中断还是主循环养狗,实现条件互驳,这只狗都一样忠实。
6:在这里不得不说程序结构,那种流水帐的程序结构,不管是中断还是主循环养狗,结果都是一样:养了一只癞皮狗!关于这一点,如果谁有不同意见,可以提出来讨论讨论
7:这些都做好了有什么用呢?
一个再忠实的狗,也只能是系统的一部分,在矿安产品中有一个说法叫:本安型,也就是本质安全性,当然,MCU系统是无法实现本安性的,所以需要看家的 DOG,但系统的根本依然是要努力提高系统本身的安全性,一个再好的看门狗动作处理,也只能是尽量恢复现场,并且,系统也绝不能总是出现保护的行为,如果这样,将是一个不可原谅的设计……
这就又延伸到电路设计和PCB设计甚至工艺设计等等问题,这不是这个主题帖讨论的范围,所以,俺也不说了……
二:
MCU系统为什么要DOG!?
DOG是为了防止不知道哪天出现的窃贼的,对付已知出现的窃贼,最好的办法就是直接拿棍子轰倒……
对于一个系统,通过测试只是尽可能模拟实际可能出现的干扰,显然:从数学的概率讲,不能涵盖100%的情况,并且,一个产品可能大批量的被众多不同类型用户使用,所以,测试条件的样本抽取本就不可能重现100%现实状况。
一句胡说八道的理论:如果你的系统产生复位,说明你的设计不行,改好设计就可以,所以没有必要要看门狗……
本懒得反驳,看应和者居然众多,避免错误的理论误人子弟,必须以证视听:
我已经讲过多次了,测试只是一种必要不充分的条件,请认真理解这个来自数学的概念……
没有测试,只能通过在实际使用条件下的试用来检验设计,这样的设计更加是不充分的测试,而且,这样的测试只能更加无序的浪费时间和精力……
1:要讲系统的可靠性,首先要讲系统安全保证机制的可靠性,对于MCU系统来说,养DOG是其中最重要的一条
2:很多人可能要讲,我没养DOG,我的系统也很可靠,所以看门狗没有必要。
这是一种不需要反驳的观点,从理论上来讲,养狗安全系数肯定会高一些;
3:在系统里面养狗,狗本身电路也是存在失效可能性的,在上面有人曾讲到MAX813翘了,这就属于这种情况,MAX813还属于比较好的,过去很多人经常用到的25045,内部集成了EE等资源,这东西不怎的,很容易被干扰得自己挂了。
4:很多人在争执系统里面应该如何养狗,很多人片面的以为狗一定要在主循环里面养才是最好的,在这里不得不说说hotpower的中断养狗论了,当年 hotpower为了证明那些人的说法是何其错误,整出了一个中断养狗论,很多人根本没看懂hotpower想要表达的真实含义,从原理上讲,hotpower其实要表达的是:要想养一条忠实听话的好狗,在哪个地方养根本不重要,在哪个地方养都可以达到最好的效果,真正重要的是要注意软体返回的各个路径,在异常的时候,要通过条件互驳,让狗起来看家。
5:虽然hotpower中断养狗的方法也可以达到比较好的看家效果,但俺却是一个主循环养狗的坚定拥护者,原因无它,第一:主循环养狗简单明了;第二:主循环养狗比较省代码,第三:不管是中断还是主循环养狗,实现条件互驳,这只狗都一样忠实。
6:在这里不得不说程序结构,那种流水帐的程序结构,不管是中断还是主循环养狗,结果都是一样:养了一只癞皮狗!关于这一点,如果谁有不同意见,可以提出来讨论讨论
7:这些都做好了有什么用呢?
一个再忠实的狗,也只能是系统的一部分,在矿安产品中有一个说法叫:本安型,也就是本质安全性,当然,MCU系统是无法实现本安性的,所以需要看家的 DOG,但系统的根本依然是要努力提高系统本身的安全性,一个再好的看门狗动作处理,也只能是尽量恢复现场,并且,系统也绝不能总是出现保护的行为,如果这样,将是一个不可原谅的设计……
这就又延伸到电路设计和PCB设计甚至工艺设计等等问题,这不是这个主题帖讨论的范围,所以,俺也不说了……
二:
MCU系统为什么要DOG!?
DOG是为了防止不知道哪天出现的窃贼的,对付已知出现的窃贼,最好的办法就是直接拿棍子轰倒……
对于一个系统,通过测试只是尽可能模拟实际可能出现的干扰,显然:从数学的概率讲,不能涵盖100%的情况,并且,一个产品可能大批量的被众多不同类型用户使用,所以,测试条件的样本抽取本就不可能重现100%现实状况。
一句胡说八道的理论:如果你的系统产生复位,说明你的设计不行,改好设计就可以,所以没有必要要看门狗……
本懒得反驳,看应和者居然众多,避免错误的理论误人子弟,必须以证视听:
我已经讲过多次了,测试只是一种必要不充分的条件,请认真理解这个来自数学的概念……
没有测试,只能通过在实际使用条件下的试用来检验设计,这样的设计更加是不充分的测试,而且,这样的测试只能更加无序的浪费时间和精力……
一个是安装chmsee,用新立得管理工具,搜索chmsee,安装即可。
另一个就是给firefox安装个插件,工具--->添加组件--->获取附加组件搜索chm reader
另一个就是给firefox安装个插件,工具--->添加组件--->获取附加组件搜索chm reader
下载:
你可以开多个浏览器IE,FIREFOX等来测试,你也可以通过它来进行两个远在天边的人来聊天:
点击:http://www.5ifd.com/comet
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comet demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<div id="content">
</div>
<p>
<form action="" method="get" onsubmit="comet.doRequest($('word').value);$('word').value='';return false;">
<input type="text" name="word" id="word" value="" />
<input type="submit" name="submit" value="Send" />
</form>
</p>
<script type="text/javascript">
var Comet = Class.create();
Comet.prototype = {
timestamp: 0,
url: './backend.php',
noerror: true,
initialize: function() { },
connect: function()
{
this.ajax = new Ajax.Request(this.url, {
method: 'get',
parameters: { 'timestamp' : this.timestamp },
onSuccess: function(transport) {
// handle the server response
var response = transport.responseText.evalJSON();
this.comet.timestamp = response['timestamp'];
this.comet.handleResponse(response);
this.comet.noerror = true;
},
onComplete: function(transport) {
// send a new ajax request when this request is finished
if (!this.comet.noerror)
// if a connection problem occurs, try to reconnect each 5 seconds
setTimeout(function(){ comet.connect() }, 5000);
else
this.comet.connect();
this.comet.noerror = false;
}
});
this.ajax.comet = this;
},
disconnect: function()
{
},
handleResponse: function(response)
{
$('content').innerHTML += '<div>' + response['msg'] + '</div>';
},
doRequest: function(request)
{
new Ajax.Request(this.url, {
method: 'get',
parameters: { 'msg' : request }
});
}
}
var comet = new Comet();
comet.connect();
</script>
</body>
</html>
prototype.js
下载文件
你可以开多个浏览器IE,FIREFOX等来测试,你也可以通过它来进行两个远在天边的人来聊天:
点击:http://www.5ifd.com/comet
<?php
$filename = dirname(__FILE__).'/data.txt';
// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
file_put_contents($filename,$msg);
die();
}
// infinite loop until the data file is not modified
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
usleep(10000); // sleep 10ms to unload the CPU
clearstatcache();
$currentmodif = filemtime($filename);
}
// return a json array
$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();
?>
$filename = dirname(__FILE__).'/data.txt';
// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
file_put_contents($filename,$msg);
die();
}
// infinite loop until the data file is not modified
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
usleep(10000); // sleep 10ms to unload the CPU
clearstatcache();
$currentmodif = filemtime($filename);
}
// return a json array
$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comet demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<div id="content">
</div>
<p>
<form action="" method="get" onsubmit="comet.doRequest($('word').value);$('word').value='';return false;">
<input type="text" name="word" id="word" value="" />
<input type="submit" name="submit" value="Send" />
</form>
</p>
<script type="text/javascript">
var Comet = Class.create();
Comet.prototype = {
timestamp: 0,
url: './backend.php',
noerror: true,
initialize: function() { },
connect: function()
{
this.ajax = new Ajax.Request(this.url, {
method: 'get',
parameters: { 'timestamp' : this.timestamp },
onSuccess: function(transport) {
// handle the server response
var response = transport.responseText.evalJSON();
this.comet.timestamp = response['timestamp'];
this.comet.handleResponse(response);
this.comet.noerror = true;
},
onComplete: function(transport) {
// send a new ajax request when this request is finished
if (!this.comet.noerror)
// if a connection problem occurs, try to reconnect each 5 seconds
setTimeout(function(){ comet.connect() }, 5000);
else
this.comet.connect();
this.comet.noerror = false;
}
});
this.ajax.comet = this;
},
disconnect: function()
{
},
handleResponse: function(response)
{
$('content').innerHTML += '<div>' + response['msg'] + '</div>';
},
doRequest: function(request)
{
new Ajax.Request(this.url, {
method: 'get',
parameters: { 'msg' : request }
});
}
}
var comet = new Comet();
comet.connect();
</script>
</body>
</html>
prototype.js
基于libevent 1.3e, 利用了libevent里面现成的http库
编译方法,先安装libevent,然后
cc -o httpd httpd.c -L/usr/local/lib/ -Wall -O2 -I/usr/local/include -ggdb -levent
可以作为一个商业运行环境的基础,真正的业务系统里面,comet server也很简单,比这个程序复杂不了什么,它只处理comet,只是一个通道,复杂的东西放到其他地方。
打算作为下图中的一个模块
阅读全文
编译方法,先安装libevent,然后
cc -o httpd httpd.c -L/usr/local/lib/ -Wall -O2 -I/usr/local/include -ggdb -levent
可以作为一个商业运行环境的基础,真正的业务系统里面,comet server也很简单,比这个程序复杂不了什么,它只处理comet,只是一个通道,复杂的东西放到其他地方。
打算作为下图中的一个模块
阅读全文
php -i|grep sock
mysqli.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock
pdo_mysql.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock
cat /usr/local/php/etc/php.ini |grep mysqld.sock
pdo_mysql.default_socket=/var/run/myslqd/mysqld.sock
mysqli.default_socket = /var/run/myslqd/mysqld.sock
背景:(1)偶尔会出现mysql的server和mysql的client默认的socke文件不在一个地方,我们用mysql时会出现一个找不到mysql.sock的情况。
(2)因非正常关机出现:/tmp/mysql.sock 不见了,找不到了,如何连接上去的问题?(其他机器通过tcp可以的)
先放个命令在mysql运行机上链接的方法:
原因一:
linux系统一次不正常关机后,连接mysql的时候系统提示不能通过/tmp/mysql.sock文件进行连接,或者非正确关闭时,导致mysql.sock文件再次丢失,当你在次启动时出现如下错误,connect mysqld faild ,/tmp/mysql.sock can't find
mysql.sock的丢失主要是因为更改了机器名,在没有正确关闭mysqld的情况下,去执行mysqld_safe,这样他就删除已经运行的mysql.sock了。正常情况下,mysqld_safe 应该告诉我们是已经有Mysqld运行了,而上边并没有这样提示,主要是更改机器名导致mysqld_safe判断是否已经运行,去找的是newhostname.pid文件,但已经运行的mysqld生成的是oldhostname.pid, 肯定找不到newhostname.pid,所以mysqld_safe收拾一下(清理了mysql.sock),然后去重启,但是ibdata需要lock,它lock不了,还是起不了,但是老的mysql.sock就消失。
原因二:
连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件被删除了,本地客户就不能连接。这可能发生在你的系统运行一个cron任务删除了/tmp下的临时文件。
如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。因为服务器在启动时重新创建它。
解决办法,实时上,在/etc/init.d 下有个连接启动脚本 mysqld ,我们启动时可以直接用它 service mysqld start |stop
来自:http://blog.csdn.net/imzoer/article/details/8444400
实践情况如下:
[root@localhost init.d]# mysqladmin -u root -hlocalhost -p shutdown
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysqld.sock' exists!
直接干死了:
pkill -9 mysql
重启:
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/db/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/db/mysql/localhost.err --open-files-limit=65535 --pid-file=/usr/local/mysql/xd_xiyou_db_7.pid --socket=/tmp/mysqld.sock --port=3306
————————————————上面这种太粗暴,实践操作Ok如下:—————————————————————————
[root@localhost init.d]# service mysql stop
Shutting down MySQL..... [ OK ]
[root@localhost init.d]# service mysql start
Starting MySQL... [ OK ]
启动原理:
/etc/init.d/mysql
里写明了basedir及datadir,这块datadir很重要,启动时起了很大的作用,在安装时就定下来不改动最好了:
——————————————————————————————————————————————————————————
出现以下的信息:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
如果还不行.就先
#ps -aux|grep mysql
找mysql的进程里的那个socket位置,如:
方法一:
mysql --port=3306 -uroot -p123qwe*** -S /var/lib/mysql/mysql.sock
方法二:
mysql --socket=/var/lib/mysql/mysql.sock --port=3306 -uroot -p123qwe***
方法三:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
阅读全文
mysqli.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock
pdo_mysql.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock
cat /usr/local/php/etc/php.ini |grep mysqld.sock
pdo_mysql.default_socket=/var/run/myslqd/mysqld.sock
mysqli.default_socket = /var/run/myslqd/mysqld.sock
背景:(1)偶尔会出现mysql的server和mysql的client默认的socke文件不在一个地方,我们用mysql时会出现一个找不到mysql.sock的情况。
(2)因非正常关机出现:/tmp/mysql.sock 不见了,找不到了,如何连接上去的问题?(其他机器通过tcp可以的)
先放个命令在mysql运行机上链接的方法:
原因一:
linux系统一次不正常关机后,连接mysql的时候系统提示不能通过/tmp/mysql.sock文件进行连接,或者非正确关闭时,导致mysql.sock文件再次丢失,当你在次启动时出现如下错误,connect mysqld faild ,/tmp/mysql.sock can't find
mysql.sock的丢失主要是因为更改了机器名,在没有正确关闭mysqld的情况下,去执行mysqld_safe,这样他就删除已经运行的mysql.sock了。正常情况下,mysqld_safe 应该告诉我们是已经有Mysqld运行了,而上边并没有这样提示,主要是更改机器名导致mysqld_safe判断是否已经运行,去找的是newhostname.pid文件,但已经运行的mysqld生成的是oldhostname.pid, 肯定找不到newhostname.pid,所以mysqld_safe收拾一下(清理了mysql.sock),然后去重启,但是ibdata需要lock,它lock不了,还是起不了,但是老的mysql.sock就消失。
原因二:
连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件被删除了,本地客户就不能连接。这可能发生在你的系统运行一个cron任务删除了/tmp下的临时文件。
如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。因为服务器在启动时重新创建它。
解决办法,实时上,在/etc/init.d 下有个连接启动脚本 mysqld ,我们启动时可以直接用它 service mysqld start |stop
来自:http://blog.csdn.net/imzoer/article/details/8444400
实践情况如下:
[root@localhost init.d]# mysqladmin -u root -hlocalhost -p shutdown
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysqld.sock' exists!
直接干死了:
pkill -9 mysql
重启:
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/db/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/db/mysql/localhost.err --open-files-limit=65535 --pid-file=/usr/local/mysql/xd_xiyou_db_7.pid --socket=/tmp/mysqld.sock --port=3306
————————————————上面这种太粗暴,实践操作Ok如下:—————————————————————————
[root@localhost init.d]# service mysql stop
Shutting down MySQL..... [ OK ]
[root@localhost init.d]# service mysql start
Starting MySQL... [ OK ]
启动原理:
/etc/init.d/mysql
里写明了basedir及datadir,这块datadir很重要,启动时起了很大的作用,在安装时就定下来不改动最好了:
——————————————————————————————————————————————————————————
出现以下的信息:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
如果还不行.就先
#ps -aux|grep mysql
找mysql的进程里的那个socket位置,如:
方法一:
mysql --port=3306 -uroot -p123qwe*** -S /var/lib/mysql/mysql.sock
方法二:
mysql --socket=/var/lib/mysql/mysql.sock --port=3306 -uroot -p123qwe***
方法三:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
阅读全文
当你有QQ消息时,QQ的小图标会晃动,我们甚至还可以设定QQ有消息时,自动弹出来!
这些在C/S模式下很容易实现!如果要在B/S模式如何来实现呢?
我们的肯定会想到在客服端调用ajax在后台不断的查询服务器.看是否有关于自己的消息.如果有则查询返回.这种做法肯定会大量的占用系统的资源!不可取!
现在DWR的反转AJAX功能.允许我们从服务器端来控制客服端.而不需要客户端来请求.服务器可以自动把消息发给指定的客户端!
我不能把公司的代码贴出来,所以我自己写了一个DEMO,已经实现了对指定用户发送消息的功能,并且即时显示在指定的用户界面上面.当然你可以修改这些,让它弹出来显示,或者像QQ一样在你页面的某个角落让消息的图标闪动:)
下面我做一个简单的说明:阅读全文
这些在C/S模式下很容易实现!如果要在B/S模式如何来实现呢?
我们的肯定会想到在客服端调用ajax在后台不断的查询服务器.看是否有关于自己的消息.如果有则查询返回.这种做法肯定会大量的占用系统的资源!不可取!
现在DWR的反转AJAX功能.允许我们从服务器端来控制客服端.而不需要客户端来请求.服务器可以自动把消息发给指定的客户端!
我不能把公司的代码贴出来,所以我自己写了一个DEMO,已经实现了对指定用户发送消息的功能,并且即时显示在指定的用户界面上面.当然你可以修改这些,让它弹出来显示,或者像QQ一样在你页面的某个角落让消息的图标闪动:)
下面我做一个简单的说明:阅读全文
#include "gtk/gtk.h"
gboolean draw_some( GtkWidget *widget, GdkEventExpose *event,
gpointer data )
{
gdk_draw_line( widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE( widget )],
10, 10, 100, 100 );
return TRUE;
}
int main( int argc, char *argv[] )
{
GtkWidget* window;
GtkWidget* draw_area;
gtk_init( &argc, &argv );
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_widget_set_usize( window, 400, 300 );
g_signal_connect( G_OBJECT( window ), "destroy",
G_CALLBACK( gtk_main_quit ), NULL );
draw_area = gtk_drawing_area_new( );
gtk_widget_set_size_request( draw_area, 100, 100 );
g_signal_connect( G_OBJECT( draw_area ), "expose_event",
G_CALLBACK( draw_some ), NULL );
gtk_container_add( GTK_CONTAINER( window ), draw_area );
gtk_widget_show( draw_area );
gtk_widget_show( window );
gtk_main( );
return 0;
}
gboolean draw_some( GtkWidget *widget, GdkEventExpose *event,
gpointer data )
{
gdk_draw_line( widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE( widget )],
10, 10, 100, 100 );
return TRUE;
}
int main( int argc, char *argv[] )
{
GtkWidget* window;
GtkWidget* draw_area;
gtk_init( &argc, &argv );
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_widget_set_usize( window, 400, 300 );
g_signal_connect( G_OBJECT( window ), "destroy",
G_CALLBACK( gtk_main_quit ), NULL );
draw_area = gtk_drawing_area_new( );
gtk_widget_set_size_request( draw_area, 100, 100 );
g_signal_connect( G_OBJECT( draw_area ), "expose_event",
G_CALLBACK( draw_some ), NULL );
gtk_container_add( GTK_CONTAINER( window ), draw_area );
gtk_widget_show( draw_area );
gtk_widget_show( window );
gtk_main( );
return 0;
}
用jsp帮助实现的,当中遇到了不少的问题,后来在ITPUB的一些朋友和自己的辛苦努力下终于完成了该程序阅读全文
现在大家使用开发工具有点盲目,什么都用,本来选择多是好事,但如果进行专业开发,选错开发工具将造成很大的影响,甚至是致命的。
几年来我一直做嵌入式Linux,也写过很多的程序,从系统配置程序,编辑器,拔号程序到监控系统到电子邮件到浏览器(这两个主要是改人家的)。马马虎虎还可以说是一个经验丰富的程序员,对中国的Linux行业也比较熟悉。我一直用这些开发工具。基本上没有什么解决不了的问题(就客户或开发需求而言)。我向来很讲究社会主义精神的,自己有所得就拿出来给大家分享,如果有用大家就参考参考,没用就批评或说出自己的看法。
我的经验归纳起来很简单,就是做开发最好还是用redhat(开发英文应用)或turbolinux系统(开发中文应用)+GTK/GNOME+glade+anjuta+sourcenavigator。语言方面当然是使用C/C++了,写应用主要是C,做图形系统底层时(如windows manager, X系统) 则主要是C++。
至于QT/KDE/Designer的组合我不是很推荐。我研究了不少时间,总觉得写不出好的东西来,甚至做了一个embedded qt 的中文输入也没用上。所以我也不是很支持用KDE进行开发,我想这与我个人喜好没有很大的关系。
Kyrix本应该是不错的东西,但要这么贵我觉得就不用去考虑它了。
其它的新鲜东西就不用谈了,大偏或太先进的东西只能拿去研究或做技术筹备,等成熟了我们再上。
回复:
能详细谈谈不使用qt的理由么?为什么写不出好东西?
总觉得GTK很土,glade功能也不够强大。qt的类库使用起来还是很舒服的,特别是对xml, regexp的支持很不错,有时候即使不写GUI也想用qt。觉得qt不爽的是它的性能和许可证,但GTK是从根上就烂了,控件很土,接口累赘,比 motif好不到哪里(对于同样的程序,qt的代码量一般是gtk的一半),那个GTK的祖宗gimp是窗口污染的典型例子。
回复:
这样说未免太偏激了
gimp窗口太多,但是anjuta就很整洁, 关键是你怎么用,
QT也不错,但是我会选择gtk2的。
回复:
还是喜欢使用GTK+。QT没有使用过,不过觉得GTK+写程序还是很简单。不过可以GTK+控件不是很多。如果有一天可以多到和Delphi那么多就好了。还有GLIB也非常不错。许多自己以前要写的数据结构现在都有了,省了不少的事情,而且GLIB不依赖图形环境,不写GUI,只用GLIB也不错
回复:
我不敢打赌你用了GTK就会放弃QT了。
回复:
我个人觉得用什么都一个样,关键是你能不能开发出好东东来,如果只是吹象的话,那谁都会。
如果真让我在GTK+, QT和Klyix三者间选择一种的话,我首先排除Klyix,它好用,但不自由,也不能用于开发底层的东西,我想真正的Linux高手是不甘心于开发一些中看不中用的小东西,这才是Linux真正的魅力。
接下来,我再排除QT,同样是因为它不是真正的Free,因为我要自由,谁不给自由我就轰谁!
回复:
gtk 和 qt 都得会才好,
我本来是学 QT的
但是我想写一个 xmms 的 plugin。
还得学 GTK 才行呀。
回复:
gtk的程序又小又快,占内存又少,界面不但支持漂亮的theme,还能把整个界面做成一张图片一样。代码虽多,但用熟了易记且可大量复制。 而且它是完全的free,想把它怎么改怎么卖都成。
至于qt, 程序代码是很少,但占的内存大,qt库本身也比gtk库大得多,要是做嵌入式应用就远不如gtk了。
qt的界面才土,就像win95一样,支持的theme也不漂亮,GNOME就比KDE漂亮多了。
qt写的商用程序有版权问题,特别是qt/e的贵,钱都给trolltech赚了....
几年来我一直做嵌入式Linux,也写过很多的程序,从系统配置程序,编辑器,拔号程序到监控系统到电子邮件到浏览器(这两个主要是改人家的)。马马虎虎还可以说是一个经验丰富的程序员,对中国的Linux行业也比较熟悉。我一直用这些开发工具。基本上没有什么解决不了的问题(就客户或开发需求而言)。我向来很讲究社会主义精神的,自己有所得就拿出来给大家分享,如果有用大家就参考参考,没用就批评或说出自己的看法。
我的经验归纳起来很简单,就是做开发最好还是用redhat(开发英文应用)或turbolinux系统(开发中文应用)+GTK/GNOME+glade+anjuta+sourcenavigator。语言方面当然是使用C/C++了,写应用主要是C,做图形系统底层时(如windows manager, X系统) 则主要是C++。
至于QT/KDE/Designer的组合我不是很推荐。我研究了不少时间,总觉得写不出好的东西来,甚至做了一个embedded qt 的中文输入也没用上。所以我也不是很支持用KDE进行开发,我想这与我个人喜好没有很大的关系。
Kyrix本应该是不错的东西,但要这么贵我觉得就不用去考虑它了。
其它的新鲜东西就不用谈了,大偏或太先进的东西只能拿去研究或做技术筹备,等成熟了我们再上。
回复:
能详细谈谈不使用qt的理由么?为什么写不出好东西?
总觉得GTK很土,glade功能也不够强大。qt的类库使用起来还是很舒服的,特别是对xml, regexp的支持很不错,有时候即使不写GUI也想用qt。觉得qt不爽的是它的性能和许可证,但GTK是从根上就烂了,控件很土,接口累赘,比 motif好不到哪里(对于同样的程序,qt的代码量一般是gtk的一半),那个GTK的祖宗gimp是窗口污染的典型例子。
回复:
这样说未免太偏激了
gimp窗口太多,但是anjuta就很整洁, 关键是你怎么用,
QT也不错,但是我会选择gtk2的。
回复:
还是喜欢使用GTK+。QT没有使用过,不过觉得GTK+写程序还是很简单。不过可以GTK+控件不是很多。如果有一天可以多到和Delphi那么多就好了。还有GLIB也非常不错。许多自己以前要写的数据结构现在都有了,省了不少的事情,而且GLIB不依赖图形环境,不写GUI,只用GLIB也不错
回复:
我不敢打赌你用了GTK就会放弃QT了。
回复:
我个人觉得用什么都一个样,关键是你能不能开发出好东东来,如果只是吹象的话,那谁都会。
如果真让我在GTK+, QT和Klyix三者间选择一种的话,我首先排除Klyix,它好用,但不自由,也不能用于开发底层的东西,我想真正的Linux高手是不甘心于开发一些中看不中用的小东西,这才是Linux真正的魅力。
接下来,我再排除QT,同样是因为它不是真正的Free,因为我要自由,谁不给自由我就轰谁!
回复:
gtk 和 qt 都得会才好,
我本来是学 QT的
但是我想写一个 xmms 的 plugin。
还得学 GTK 才行呀。
回复:
gtk的程序又小又快,占内存又少,界面不但支持漂亮的theme,还能把整个界面做成一张图片一样。代码虽多,但用熟了易记且可大量复制。 而且它是完全的free,想把它怎么改怎么卖都成。
至于qt, 程序代码是很少,但占的内存大,qt库本身也比gtk库大得多,要是做嵌入式应用就远不如gtk了。
qt的界面才土,就像win95一样,支持的theme也不漂亮,GNOME就比KDE漂亮多了。
qt写的商用程序有版权问题,特别是qt/e的贵,钱都给trolltech赚了....
http://www.sunnyu.com/?p=93
给fast-cgi方式的php做一个检查脚本
使用fast-cgi方式的php在使用,有时候由于编写的代码问题,使处理代码的php-cgi进程的运行占用很多时间,在将所有活动的 php-cgi 进程都占用后,web服务器对php的请求就失去响应了。
通过命令查看服务器上一共开了多少的 php-cgi 进程
1.
使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求
1.
当被使用的php进程接近所开启的php进程数时,可以考虑将被耗用的php进程释放一下,以防止网站访问的阻塞。
按照以上思路编写了一个检查脚本。
1.
其中 /root/tools/resetphp.sh 为编写的php重启脚本。
脚本可以放到 crontab 中,做自动定时检查处理。
给fast-cgi方式的php做一个检查脚本
使用fast-cgi方式的php在使用,有时候由于编写的代码问题,使处理代码的php-cgi进程的运行占用很多时间,在将所有活动的 php-cgi 进程都占用后,web服务器对php的请求就失去响应了。
通过命令查看服务器上一共开了多少的 php-cgi 进程
1.
ps -fe |grep "php" | grep -v "grep" | wc -l
使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求
1.
netstat -anop | grep "php" | grep -v "grep" | wc -l
当被使用的php进程接近所开启的php进程数时,可以考虑将被耗用的php进程释放一下,以防止网站访问的阻塞。
按照以上思路编写了一个检查脚本。
1.
#
#!/bin/sh
#
echo "begin check"
#define default check delta num
defdeltacount=10
phpcount=`ps -fe |grep "php" | grep -v "grep" | wc -l`
netstatcount=`sudo netstat -anop | grep "php" | grep -v "grep" | wc -l`
echo " php process count is $phpcount
netstat process count is $netstatcount"
deltacount=`expr $phpcount - $netstatcount`
if [ -n "$1" ]; then
defdeltacount=$1
fi
echo "deltacount is $deltacount, defdeltacount is $defdeltacount"
if [ $deltacount -lt $defdeltacount ]; then
echo " need reset"
sudo /root/tools/resetphp.sh
else
echo " not need reset"
fi
echo "check end"
#!/bin/sh
#
echo "begin check"
#define default check delta num
defdeltacount=10
phpcount=`ps -fe |grep "php" | grep -v "grep" | wc -l`
netstatcount=`sudo netstat -anop | grep "php" | grep -v "grep" | wc -l`
echo " php process count is $phpcount
netstat process count is $netstatcount"
deltacount=`expr $phpcount - $netstatcount`
if [ -n "$1" ]; then
defdeltacount=$1
fi
echo "deltacount is $deltacount, defdeltacount is $defdeltacount"
if [ $deltacount -lt $defdeltacount ]; then
echo " need reset"
sudo /root/tools/resetphp.sh
else
echo " not need reset"
fi
echo "check end"
其中 /root/tools/resetphp.sh 为编写的php重启脚本。
脚本可以放到 crontab 中,做自动定时检查处理。
php中mysql_pconnect()的实现方式:阅读全文
<?php
set_time_limit(0);
header("Connection: Keep-Alive");
header("Proxy-Connection: Keep-Alive");
for($i=0; $i<1000; $i++) {
print "fuck man!".$i."<br>";
flush();
sleep(3);
clearstatcache();
}
?>
set_time_limit(0);
header("Connection: Keep-Alive");
header("Proxy-Connection: Keep-Alive");
for($i=0; $i<1000; $i++) {
print "fuck man!".$i."<br>";
flush();
sleep(3);
clearstatcache();
}
?>