2009年8月12日星期三

僵尸进程的产生和避免,以及wait,waitpid的使用

转篇文章 归档

在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程。

僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程。
defunct进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的process个数的限制已经快超过了,zombie进程不会有更多的坏处。

产生原因:
1.在子进程终止后到父进程调用wait()前的时间里,子进程被称为zombie。
2.网络原因有时会引起僵死进程。

解决方法:
1.设置SIGCLD信号为SIG_IGN,系统将不产生僵死进程。
2.用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程。


怎样产生僵尸进程的:
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

怎么查看僵尸进程:
利用命令ps,可以看到有标记为Z的进程就是僵尸进程。
怎样来清除僵尸进程:
1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
===========================================
在Linux中可以用
ps auwx
发现僵尸进程
a all w/ tty, including other users 所有窗口和终端,包括其他用户的进程
u user-oriented 面向用户(用户友好)
-w,w wide output 宽格式输出
x processes w/o controlling ttys
在僵尸进程后面 会标注
ps axf
看进程树,以树形方式现实进程列表
ps axm
会把线程列出来,在linux下进程和线程是统一的,是轻量级进程的两种方式。
ps axu
显示进程的详细状态
===========================================
killall
kill -15
kill -9
一般都不能杀掉 defunct进程
用了kill -15,kill -9以后 之后反而会多出更多的僵尸进程
kill -kill pid
fuser -k pid
可以考虑杀死他的parent process,
kill -9 他的parent process
===========================================

一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程(Zombie Process)。
避免zombie的方法:
1)在SVR4中,如果调用signal或sigset将SIGCHLD的配置设置为忽略,则不会产生僵死子进程。另外,使用SVR4版的sigaction,则可设置SA_NOCLDWAIT标志以避免子进程僵死。
Linux中也可使用这个,在一个程序的开始调用这个函数
signal(SIGCHLD,SIG_IGN);
2)调用fork两次。程序8 - 5 实现了这一点。
3)用waitpid等待子进程返回.
===========================================
zombie进程是僵死进程。防止它的办法,一是用wait,waitpid之类的函数获得
进程的终止状态,以释放资源。另一个是fork两次
===========================================
defunct进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的process个数的限制已经快超过了,zombie进程不会有更多的坏处。
可能唯一的方法就是reboot系统可以消除zombie进程。
===========================================
任何程序都有僵尸状态,它占用一点内存资源(也就是进程表里还有一个记录),仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的
fork与zombie/defunct"
在Unix下的一些进程的运作方式。当一个进程死亡时,它并不是完全的消失了。进程终止,它不再运行,但是还有一些残留的小东西等待父进程收回。这些残留的东西包括子进程的返回值和其他的一些东西。当父进程 fork()一个子进程后,它必须用 wait() 或者 waitpid() 等待子进程退出。正是这个 wait() 动作来让子进程的残留物消失。
自然的,在上述规则之外有个例外:父进程可以忽略 SIGCLD 软中断而不必要 wait()。可以这样做到(在支持它的系统上,比如Linux):
main()
{
signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */
.
.
fork();
fork();
fork(); /* Rabbits, rabbits, rabbits! */
}
现在,子进程死亡时父进程没有 wait(),通常用 ps 可以看到它被显示为“”。它将永远保持这样 直到 父进程 wait(),或者按以下方法处理。
这里是你必须知道的另一个规则:当父进程在它wait()子进程之前死亡了(假定它没有忽略 SIGCLD),子进程将把 init(pid1)进程作为它的父进程。如果子进程工作得很好并能够控制,这并不是问题。但如果子进程已经是defunct,我们就有了一点小麻烦。看,原先的父进程不可能再 wait(),因为它已经消亡了。这样,init 怎么知道 wait() 这些zombie 进程。
答案:不可预料的。在一些系统上,init周期性的破坏掉它所有的defunct进程。在另外一些系统中,它干脆拒绝成为任何defunct进程的父进程,而是马上毁灭它们。如果你使用上述系统的一种,可以写一个简单的循环,用属于init的defunct进程填满进程表。这大概不会令你的系统管理员很高兴吧?
你的任务:确定你的父进程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有进程。不过,你也未必要总是这样做(比如,你要起一个 daemon 或是别的什么东西),但是你必须小心编程,如果你是一个 fork()的新手。另外,也不要在心理上有任何束缚。
总结:
子进程成为 defunct 直到父进程 wait(),除非父进程忽略了 SIGCLD 。
更进一步,父进程没有 wait() 就消亡(仍假设父进程没有忽略 SIGCLD )的子进程(活动的或者 defunct)成为 init 的子进程,init 用重手法处理它们。

wait的函数原型是:
  
  #include /* 提供类型pid_t的定义 */
  #include
   pid_t wait(int *status)
  
  进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程, wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
  
  参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:
  
  pid = wait(NULL);
  
  如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
 

waitpid的函数原型是:


  简介
  waitpid系统调用在Linux函数库中的原型是:
  
  #include /* 提供类型pid_t的定义 */
  #include
  pid_t waitpid(pid_t pid,int *status,int options)

从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。下面我们就来详细介绍一下这两个参数:
  
  ● pid
  
  从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。
  
  pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
  
  pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
  
  pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
  
  pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。

  ● options

  options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用,比如:


  ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);


  如果我们不想使用它们,也可以把options设为0,如:


  ret=waitpid(-1,NULL,0);
  
  如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。
  
  而WUNTRACED参数,由于涉及到一些跟踪调试方面的知识,加之极少用到,这里就不多费笔墨了,有兴趣的读者可以自行查阅相关材料。
  
  看到这里,聪明的读者可能已经看出端倪了--wait不就是经过包装的waitpid吗?没错,察看<内核源码目录>/include/unistd.h文件349-352行就会发现以下程序段:
  
  static inline pid_t wait(int * wait_stat)
  {
   return waitpid(-1,wait_stat,0);
  }
  

  返回值和错误
  
  waitpid的返回值比wait稍微复杂一些,一共有3种情况:
  
  ● 当正常返回的时候,waitpid返回收集到的子进程的进程ID;
  
  ● 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
  
  ● 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
  
  当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD

其它:

调用 wait&waitpid 来处理终止的子进程:
pid_t wait(int * statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);

两个函数都返回两个值:函数的返回值和终止的子进程ID,而子进程终止的状态则是通过statloc指针返回的。

wait&waitpid 的区别是显而易见的,wait等待第一个终止的子进程,而waitpid则可以指定等待特定的子进程。这样的区别可能会在下面这种情况时表现得更加明显:
当同时有5个客户连上服务器,也就是说有五个子进程分别对应了5个客户,此时,五个客户几乎在同时请求终止,这样一来,几乎同时,五个FIN发向服务器,同样的,五个SIGCHLD信号到达服务器,然而,UNIX的信号往往是不会排队的,显然这样一来,信号处理函数将只会执行一次,残留剩余四个子进程作为僵尸进程驻留在内核空间。此时,正确的解决办法是利用waitpid(-1, &stat, WNOHANG)防止留下僵尸进程。其中的pid为-1表明等待第一个终止的子进程,而WNOHANG选择项通知内核在没有已终止进程项时不要阻塞。

wait&waitpid 区别

waitpid提供了wait函数不能实现的3个功能:

* waitpid等待特定的子进程, 而wait则返回任一终止状态的子进程;
* waitpid提供了一个wait的非阻塞版本;
* waitpid支持作业控制(以WUNTRACED选项).

用于检查wait和waitpid两个函数返回终止状态的宏:

这两个函数返回的子进程状态都保存在statloc指针中, 用以下3个宏可以检查该状态:

* WIFEXITED(status): 若为正常终止, 则为真. 此时可执行

o WEXITSTATUS(status): 取子进程传送给exit或_exit参数的低8位.

* WIFSIGNALED(status): 若为异常终止, 则为真. 此时可执行

o WTERMSIG(status): 取使子进程终止的信号编号.

* WIFSTOPPED(status): 若为当前暂停子进程, 则为真. 此时可执行

o WSTOPSIG(status): 取使子进程暂停的信号编号

2008年12月23日星期二

凌晨1点后

今天晚上特别冷,可能是我还没有进被窝的原因。反反复复的听着那首有关圣诞节的歌。不得不面对我撒的一个谎。我是不是会变的狠毒?笑。。。
照理说这么一个时间是看书学习的好时间阿,对我而言。也的确有很多工作压着。Jboss portal,AMQP,python,django。恩,如果明天还这样的话,就强制看书:)
刚才翻了一下我的CD,发现我真的相当的极品。。。 最近找到的一张很喜欢听的专辑,居然在4年前我就有CD了,怪不得有点似曾相似的感觉。话说我口味还真单一阿。
新房间大致收拾的可以住了,房子不错挺大,就是有点冷。从明天晚上(部队应该是今天)开始做俯卧撑,上周打球被mm鄙视上肢力量了。
ok喝口水,听完最后一遍,就去睡觉,明天还上班呢,能不能起的来呢 。是不是再找一集cowboy behop来看看呢,享受一下孤独呢:)

2008年12月17日星期三

498路无人售票车进站了

这两天一直坐498回学校。发现我很喜欢那班车,人不多,直接抵达学校。偶尔可以在后排找到座,可以安静的听着jazz,看着北京4环的风景。抱着自己所有洗漱用具换洗衣服,感觉一个包,一首歌,一个人就可以去任何地方了。很多年没有这样的心境了:)今次一定要好好成长。星座上说明年是我默默成长的一年,感觉还真不假。
前几天和一个同学在msn上聊天,突然说到2年后是否能见到一个闪耀的你。然后我问闪耀是什么意思?然后那边回答说就是很赞很不错。我想大概我在她印象里还是当年那个人,如果现在见到我肯定会失望吧。我觉得自己是一个自恋的人,但我差不多有1年多没有好好照过镜子了。都不知道现在自己的样子,然后我去照了一下镜子,列举了一下目前的人身,发现现在的我实在是很不赞阿 :/ 不过就在这一刻,我却觉得很开心,终于找到一件值得努力的事情了。人生有了点目标。从小就是这样只要我有所保留就一定不能完美。这次一定要认真做人,做事。一点都马虎不得。最近有点心不在焉,早上居然把洗面奶和牙膏反用,晚上坐车差点坐过站,订错机票亏了600多,开会踩坏一个花盆== 但我相信一定会好起来的。在这里告诉自己要努力,认真。
从小就想当飞行员,要做一个勇敢,自由,果断的人。是我的绝对是我的,不是我的又何必如此在意,只要自己全力争取了就行了。

圣诞前终于要把项目结了,可恶的llim已经把我分到下一个项目中去了。。。也不给个几天闲,整理一下心情。Anyway 有挑战总是好的。 希望dli界面能早点做好,别再拖了不然圣诞前就 结不了了。

2008年12月7日星期日

转篇歌词

Madagascar Lyrics
Artist(Band):Guns N' Roses
Review The Song (5) Print the Lyrics

I won't be told anymore
That I've been brought down in this storm
And left so far out from the shore
That I can't find my way back, my way anymore

Oh no I won't be told anymore
That I've been brought down in this storm
And left so far out from the shore
Oh, that I can't find my way back, my way anymore


Oh no, I...

I...


Forgive them that tear down my soul
Bless them that they might grow old
And free them so that they may know
That it's never too late

For the many times, what seemed like a memory
I've searched and found the ways you used to lure me in
I found the way, oh, why it had to be
Mired in denial and so afraid

If we ever find it’s true
That we have the strength to choose
Our freedom or the chains
We held together


(Quotes)
I'm gonna tell you a story
Stand up for righteousness!
What?
Stand up for justice!
What?
Stand up for truth!
How can a person grow up with all this around them?
You got to call on that something
Where does it come from?
That can make a way out of no way
All this hatred?
What we've got here is..
Fear!
That power that can make a way out of now no way
Failure to communicate
I tell ya I seen the lightning...I've heard the thunder roll!
Everybody's acting like we can do anything and it don't matter what we do. Maybe we gotta be extra careful because maybe it matters more than
we even know..
Sometimes...
Hatred isn't somethin' you're born with
I feel discouraged
It gets taught
Sometimes I feel discouraged
I felt this fear
He promised never to leave me, never to leave me alone, no never alone, no never alone!
Let's get something straight, alright?
Promised never to leave me!
This whole thing was fucked up
Never to leave me alone!
All men betray. All lose heart!
I don't want to lose heart!...I want to believe
Black men and white men
Together at the table of brotherhood!
I have a dream
Free at last! Free at last! Thank God almighty!! WE ARE FREE AT LAST!!


I won't be told anymore
That I've been brought down in this storm
And left so far out from the shore
That I can't find my way back, my way anymore

Oh no I won't be told anymore (If we ever find its true)
That I've been brought down in this storm (That we have the strength to choose)
And left so far out from the shore (Our freedom or the chains)
That I can't find my way back, my way anymore (We held together)


突然发现cg汉化组在昨天发布了 Tag Force 3的汉化版本,赞但是在么完全没心情玩了。

2008年12月6日星期六

写在出门前0.02秒

前几天我终于想明白了一件困扰我十几年的事情,那就是:到底如何刷牙,横着刷还是竖着刷,到底哪个是正确的。
很小的时候,我家里人都横着刷牙,所以我也是横着刷,但是别人都说竖着刷是正确的,但是明明横着刷比较方便阿,而且比较方便清洁到里面的牙齿阿。然后自从离开上大学离开家以后,我就强行纠正了我的刷牙方法,改用竖刷法 :)
虽然相当不习惯但感觉还是不错,心想这下牙齿就能很干净了。下面插播一段前几天的经历。
#-------------------------------------------------------------------------------------------------#
前一阵子发现我牙齿碰到甜的东西,比如巧克力之类的就会疼,妈呀我是不是有蛀牙了。。。 我也不怎么吃零食阿,从小就没这习惯阿。跑去买了一个电动牙刷,每天狂刷。但是没什么效果,于是就跑去看牙医,到那边发现除了我都是看智齿的mm。一下排到了最后,那个郁闷阿。检查的过程颇为简单,漱口,张嘴,5秒后医生就说可以了,然后告诉我牙齿非常健康,冏阿。就是有点牙石,这里学了一个新名词牙石。总之就是有些地方刷牙没有刷到,然后软垢堆积,然后就变硬产生了牙石,然后医生三下五除二,用一跟金属的镊子状物体在我嘴里狂刮几下,就让我下台走人了。。然后我就奇怪了,为什么我不断修正的刷牙法都没刷到那些地方呢,理论上竖刷法不是因该是完美的么。于是我就留心了一下贴在诊所墙上的名字类似《正确刷牙法》的一张图。
#--------------------------------------------------------#
发现根本不是绝对的竖刷或是横刷,处理几乎每颗牙齿的时候都会同时用到横竖两种方法,这么说我岂不是被欺骗了好多年阿。。。但是回想起来也没有一个人很认真的告诉我刷牙方法。

我又想到了方法无非是达到一个目的的手段和过程。最终目的是要让牙保持清洁,又何必在乎过程是如何的呢。我只要想如何能把牙刷干净不就好了么。 我向来都是追求结果的人阿,在么连这个都没想到呢。生活处处都得靠自己想阿,真麻烦。分析结果就是我庸人自扰了很多年。然后又觉得我的生活情商真的很低阿。比较迂腐守旧,为了遵守一个约定或是准则就算绕大圈也绝对不能触犯这个准则。不过生活情商低换来了我工作情商比较高的局面:),以前经常在个工作学习中遇到这样的情况,发现其实我不用这么看书或是用这个方法就能搞定。我和别人的情况不同,有自己的方法,就比如我高中喜欢回家先睡觉,9点10点再起来看书写字,但如果要我回家就努力看书,估计我也是在看什么杂七杂八的小说杂志。虽然不同但是最后我还是能和别人一样高效的学习。其实还想到了很多,但是发现自己的文笔尘封了5年,措辞造句都是狗屁不通了。 回头再多写点有深度的。

这两天在听枪花新专辑,觉得这次听怎么这么像bon jovi了呢,有点变质了阿。难道我都忘了那个让人不能忍受但是却让人离不开的音调? 于是乎打算去翻出旧cd来听下,但是回头一想,我已经没有cd机了阿。。。开始怀念我的松下cd机了,是不是因该再去买一个,至少不能浪费了我这一小箱CD阿,想到CD我有想起了我家一抽屉磁带,以及很久前坏掉的sony walkman,也不知道那些磁带还能不能听呢。越来越怀旧了阿。突然想起我的旧ipod了,没了cd的日子都是他配我度过的阿,因该好好保养一下了。

这出门之前写太长了,赶紧闪人了。

2008年12月2日星期二

加油写blog

决定就算我一个月就写一篇 也要坚持写下去

然后,时间间隔太久 游记就免了。。
只记得西湖和玄武湖都好漂亮,如果有一天去南京或是杭州上班的话,一定也在情理之中。
我真的会去南京或是杭州么。。。? 我想要怎么样的生活呢?
好吧2008年12月3日刚到15分钟的这一刻我觉得:
对自己要不断超越自我,克服自己的弱点,不断求索,改善自己。
对心爱的女人要呵护有加,能安心的抱着她在湖边吹风谈天,带着她天南地北笑傲江湖,
一起看电影听音乐,一起感动一起伤心。
对待家人,要尽心尽力,让他们开心。
那样因该就算是我追求的生活了吧。

最近安静下来思考的时候发现,真的每个人的世界都是不同的,我的世界,教练的世界,llim的世界,威哥的世界,小白的世界,mm的世界,jiabo的世界,willows的世界,敏捷的世界,osier的世界,hliu的世界。。。等等好多。llim的努力和等待,小白的追寻,威哥的愿望,每个人面临不同的问题,要做不同的选择。以前我一直没有意识到这个问题,我一直觉得或是下意识觉得,世界都是一样的,面对的都是升学,考试。到底在哪里我们开始有了不同? 最后我想明白了,不同一直存在,只是我考虑的事情越来越多了。原来我这才长大,是属于晚熟类型的呢。。。假了点,那如果不是晚熟,那就只能是自恋咯。

2008年10月10日星期五

长假 回来上班咯

今年这个十一长假有点长,是我近几年来唯一一次出去旅游:)
有点乐不思蜀阿。 游记回头 慢慢整理。

2008年9月3日星期三

自己组的超无敌未来超载地狱龙牌组

大岚x1
超载融合x2
卡片炮手x1
强欲之壶x1
电子黑暗刃x2
电子黑暗骨x2
电子黑暗角x2
电子恐龙x1
电子龙x3
次元融合x1
死苏x1
死毒x1
邪神大风暴x1
索佳x1
魂吸收x2
团结x1
龙镜x1
多鲁.朵拉x1
破坏轮x1
力量之壁x1
能量焊接x1
原型电子龙x2
地狱龙x1
地域帝王龙x1
炸弹龙x2
假面龙x2
未来融合x2
咒印生物光x1
炸裂装甲x1
龙脉x1

2008年8月28日星期四

旅行准备&&perl模块设计

决定去旅行了:)机票都定好了 北京 Sep 19 -> 南京 @##@$&(& 上海 -> Oct 4

先南京-> 杭州 -> 上海 -> 北京。
南京要去吃那个什么鸭粉丝汤,盐水鸭,去总统府,中山陵,雨花台
杭州要去吃楼外楼,看西湖。
上海??

走之前 要完成的工作
1.把ATP重组织,模块化。(第一个涉及到软件设计的程序。)
2.dhcpv6 测试。
下步要看的书
SVG 会ajax javascript (for my job)
lisp , emacs (for myself)

明天或是 后天整理一下perl模块和面向对象的设计。

最近又打算 重新去玩魔兽世界,玩个死亡骑士。。。反反覆覆优柔寡断==ryang?
年底买个新电脑。 有必要么?

P.S. 天杀的SICP 我什么时候能看完? 最近突然有点怀念家乡。

2008年8月27日星期三

DNS query type

Types of DNS Records:

A record: Address record maps a hostname to a 32-bit IPv4 address.

AAAA record: AAAA record IPv6 address record maps a hostname to a 128-bit IPv6 address.

CNAME record: Canonical name record is an alias of one name to another.

MX record: Mail exchange record maps a domain name to a list of mail exchange servers for that domain.

PTR record: Pointer record maps an IPv4 address to the canonical name for that host.Setting up a PTR record for a hostname in the in-addr.arpa domain that corresponds to an IP address implements reverse DNS lookup for that address.

NS record: Name server record maps a domain name to a list of DNS servers authoritative for that domain.

SOA record Start of authority record specifies the DNS server providing authoritative information about an Internet domain.

SRV record: It is a generalized service location record.

TXR record: This record is used to implement the Sender Policy Framework.

You can search or look up A Record, AAAA, CNAME, MX, NS, PTR, SOA, SPF, SRV, TXT or Find ALL of DNS entries

2008年8月20日星期三

未来在于网络

看了个新闻说是,未来的应用都将是基于网络,字符的界面将越来越淘汰?虽然我不全相信这个预测,至少对我而言再过20年30年还是会比较喜欢字符界面的吧?但是网络的确是未来的重点。毕竟喜欢直观的人好事占了大部分。
虽然世界这么小了从美国飞欧洲只要4小时。但是还是有人要被2小时路程所禁锢。我在想网络能对我的生活有多大帮助呢?

今天大致把freemind repo写好了。其实我自己做事思考很大部分还是考自己,还不习惯用工具,至少我没有好好为了自己用过freemind。但是不可否认这个工具是很棒的。可以记录也可以促进自己的思维:)
做这个应用的时候发现低端网络应用对后台的响应要求不是很高,反而是前端的界面易用性要求很高。而高端的应用就正好相反了。当然高端的web应用界面也绝对不会差。leader想的只是希望能把这个项目推广,所以对界面的使用性能很讲究,千万别小看页面上的一个小功能,这个功能可能有好多js在支持。一个项目的易用是建立在程序员对付出很多劳动的基础上得来的。

看惯了一个家伙写了个网站,然后就发达了(facebook)的新闻。在这个时代我有没有这个可能性呢?相信很多人都在这么想。
Idea阿 缺的就是 Idea 阿。什么东西能让那么多人来访问呢?依赖于一个传统或者说是现实的产业?比如开发一个游戏的站点?还是说一个创新的交流工具。都是问题阿。

最近下了决心要出去旅游了。从现在开始准备希望11月前能成行 :)

2008年8月18日星期一

我们的灵魂穿行于这个五维世界

---------------------Two films about time

前几天看了2部电影。
《The Lake House》,《Deja Vu》 都让我很有感触

先说下‘触不到的恋人’吧 理一下思路:
alex 在2004年2月初 偶然间和 在2006年的2月初的 kate 取得了通信,2人通过书信交流。

kate 在2006年2月14日 在广场上目睹一场事故。
alex 在kate未来的寓所 外种下了一棵树。
alex 在车站第一次见到了在2004年的kate 并拿到了kate的书。

随着2人交流的深入,alex 和 kate 期待见面
kate 期待接到 接到alex的电话 但是 电话却是前男友打来的。

alex 参加kate的生日宴会,交流并 kiss 了kate。

kate 和 alex 约定 在2006年(8月左右) 见面 alex 提前2年定下了餐厅
但是 最终 alex 没有出现。

kate心灰意冷 决定放弃 alex 于前男友和好。

到这里 2人认识 约1年 。

alex 搬离 水上小屋。因为在未来kate 会在那里住一年。
alex 来到 kate 将入住的 公寓把 书还给kate (在楼板的夹层里)

经过了1年
来到了 alex的2006年2月14日
alex 记起 kate 曾说过 06年2月14日 她在广场上
‘同时’kate时间2008年2月14日 kate 和 男友 到 alex弟弟的 装修公司。
看到 alex的画 得知 alex 于2年前的今天出车祸去世。 kate 赶回水边小屋 告诉alex 再等她2年到2008年2月14日 来见她。
alex时间2006年2月14日 alex 没有上前和kate相见 他选择了等待。
然后 alex 出现了 2 人的时间重合在了 2008年2月14日。

问题出现了:
2008年2月14日 alex的弟弟告诉kate,alex在2年前的今天死了,==》 kate告诉alex别在2006年2月14日见她 挽救了alex的生命。 ==》 alex 在2008年2月14日出现在 kate面前。也就是 alex没有死
||
alex没死==> kate不用写信告诉alex ==》 alex没有收到信 ==》 alex死了 !==》 ?
那到底kate写了信没有?alex死了没有?
这是一个驳论。是一个死循环。

同样《Deja Vu》中doug 回到过去,用自己的生命挽救了许多人的生命,他死了么?

他死了==》罪犯没有得逞==》他不会回到过去==》他没死==》没人阻止罪犯==》事故发生了==》doug回到过去==》他死了。

这应该就是 所谓的祖母悖论。时空在那一点上一分为二。一个时空中罪犯被阻止,doug继续生活了下去。另一个时空客轮发生了爆炸,doug没有回到过去改变未来,女主角死去了。doug回到过去改变的只是一个时空中的未来。

这不由引起了我的思考。

宇宙是在膨胀的 那是在三维的意义上 说也就是 空间上。
三维的空间和时间 形成了一个四维的世界。也就是我们意义上的时间 我们人类的感知世界。
我们能感知随着时间的增长空间的不同。

但是 假如有第五个轴呢?那什么能把时空串联呢?
我觉得在同一个时间同一空间,有很多个平行的世界,发生着不同的事件。这一秒我在写blog,下一秒就可能选择从融科9楼跳下去,然而也可能选择继续写完blog 然后开始完成今天的工作。在另一个平行世界里面的我或许又做了不同的选择。和‘Schroumldinger's cat’ 一样。 在你不去想的时候你永远不知道你下次做什么选择,只有在你想了以后才会知道你会干什么。我们程序员要为每一个可能的结果写exception。那么上帝呢,上帝是个很精明的家伙 :) 他因该也为我的各种选择写好了剧本吧。
我们人类的思维似乎是世界上唯一不受自然法则约束的东西。万物都在物理的规律下运动,而人类的思维拥有无限的自由。

思维又是于时间空间完全没有关系的东西。正好可以成为这第五轴

我觉得这第五轴是‘人类的思维所引起的行动’。我们的思维只能存在于四维的时空中但是我们的行动让我们穿行于五维的平行世界里。 我们做的每个决定,每件事,都会把我们带到不同的平行世界中。不同的平行世界给我们准备了不同的剧本和结局。我们的灵魂穿行其中。
可以说是 alex在一个平行世界中 活了下来 在另一个世界中他死于2006年2月14日。他既是死了又还活着。只是在不同的平行世界中。
这两部电影都是改变未来的幻想,但是在平行世界中其实doug 和 kate都没有改变 未来,他们只是又创造出了一个新的时间分支,在那里世界是以他们的想法继续下去了。这么说来《凉宫春日的忧郁》也是很有科学依据的:) 当这个世界不是我想的世界时,那就再创造一个吧。

我是一个唯物主义者,认同人的主观能动性。不相信宿命。
平行宇宙加人的行为因果似乎能很好让 唯物和唯心 同一在一起,还是说我偏向唯心了?

似乎还看过一部电影《time machine》,说的是一个科学家发明了一部可以任意穿梭时间的机器,他为了救自己心爱的女人回到过去,他回去了一千次但是却看到了她的一千次不同的死法。这就是人类的恐惧了。我宁愿相信平行世界也不想相信宿命论阿。

2008年8月10日星期日

奥运就这么开始了

15:08:07 坐在空调下里写这篇blog
奥运开幕了,前天晚上在小白家和大学室友一起看了奥运开幕。并没有想象中感动。
有一个礼拜没有写blog了,万恶的工作阿,不过我也发现准备充分的我,工作起来还是很行的。
这周忘了把psp充电器带回家。。。非常郁闷,正想组套无敌的卡组玩游戏王呢。
结果因为聚会喝酒让我丧失了一天行动力,周六很热就没出去,今天在家看了很久漫画。
很久之前看过这个漫画不过没看到结尾,突然就想把它看完了。。。

今天就先写这么点吧

2008年8月5日星期二

leak memory

a way to using valgrind to detect memory leak.

valgrind --tool=memcheck --leak-check=full ./exename

2008年7月30日星期三

First lisp code I wrote

I wrote this lisp program to implement Newton's method about calculate square root
To calculate a number's square root.Newton method two argus
1.the number self 'x'
2.a guess value 'g'

All code are under here:

(define zero_error "zero is not recommend to guess")
(define (ab x)
  (if (< x 0)
      (- x)
      x))
(define (good-enough? g x)
  (if (< (ab (- g (/ x g))) 0.00001)
  true
  false
  )
  )
(define (improve g x) (/ (+ g (/ x g)) 2) )
(define (sqrt-iter g x)
  (if (= g 0)
      zero_error
      (if (good-enough? (ab g) x)
          g
          (sqrt-iter (improve (ab g) x) x)
          )
      )
  )
(sqrt-iter -1 2)
(sqrt-iter 1 3)
(sqrt-iter 0 5)

2008年7月29日星期二

Collection of emacs learnning

Emacs学习了一些基本的操作,这里稍微做些整理,感觉自己还不够努力,以这样的速度估计到老也赶不上世界发展的速度。

emacs中最基本的两个键是ctrl和alt(以下称为C和M)

任何操作都是一些键的组合。想了一下一个纯文本的编辑器要实现多功能最好的就是勇这种shortcut的方式。

C - v :forward one screen
M - v :backward one screen
C - l :redisplay (make current cursor in the middle screen without any arguments)

They are the most useful shortcuts in emacs.

C - p :up line
C - n :next line
C - b :backward a character
C - f :next character
M - b :backward a word
M - f :next word

C - a :Move to beginnging of line
C - e :Move to end of line
M - a :Move to beginning of sentence
M - e :Move to end of sentence

M - < :Move to beginning of this text (press shift + comma to type <)
M - > :Move to end of this text

C - u :count a num (usually pass this num as a argument to another command)
C - g :quit all inputed commands

C - x 1 :Kill all window unless the one with cursor on

< delback > :Delete the character just before cursor
C - d :Delete the next the character after cursor
M - < del > :kill the word before cursor
M - d : delete the word after cursor

C - k :kill from cursor tp end of line
M - k :kill to the end of current sentence

Delete part

C - @/< space > : select a region
C - w : kill the words selected

difference between kill and delete
kill can be reinserted delete can not be reinserted

This kind of reinserted called yanking

C - Y :yanking(also called paste)
C - w :kill words select(also called cut)

C - _ :Undo (shift + - = _)

combination key
C - x C - f :open a file
C - x C - s :save a file

C - u 0 C - l :redisplay page using current cursor as first line
C - h k C - f :Open a new window to display help info for `C - f` command 
C - x C -b :list all buffer

C - x s :save some buffers

M - x :following long commands

C - h m :open help doc

C - x f :set a line long(using in text mode)
M - q :re-fill paragraph

C - h v :some variables can customize emacs
C - h f :function name
C - h a :open a window contain all M - x commands(support reglex)
C - h i :online help doc

C - h r :manual

2008年7月27日星期日

Sun Jul 27 11:53:19 CST 2008

新系统安装完毕
有点问题
1.输入法不响应快捷键,很不方便,期待解决办法是研究一下scim的架构
2.evolution的fliter问题,需要时间学习
3.emesene不好使了。。只能用pidgin,凑和

改善也有,不过没注意。。。

笑话一则:
今天聊天是发现,肥猪居然不知道人的牙齿掉了就不会再张出来。。。。
可能是她一直在长牙,就觉得还会张吧。。。

2008年7月26日星期六

Record google repo file

[google]
name=Google - i386
baseurl=http://dl.google.com/linux/rpm/stable/i386
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

2008年7月24日星期四

转篇关于linux目录的文章

今天突然发现忘了/var 里面存放什么东西 决定转篇文章来放着

不知道这些目录结构规范是谁设计出来的,还是比较科学的,期待有更好的目录规范 :)

linux中有很多系统目录,对各个目录的作用了解下还是蛮有好处的

  • /bin 是binary的缩写,这个目录是对Unix系统习惯的沿袭,存放着使用者最经常使用的命令。如:ls,cp,cat等为得到最小的系统操作性所需要的那 些命令通常来说,这个目录已经包含在你的“path”系统变量里面了。当在终端里输入ls,系统就会去/bin目录下面查找是不是有ls这个程序。
  • /dev: 是device的缩写.这个目录下是任何Linux的外部设备,其功能类似Dos下的.sys和Win下的.vxd。在Linux中设备和文档是用同种方 法访问的。例如:/dev/hda代表第一个物理IDE硬盘。主要存放与设备(包括外设)有关的文件(unix和linux系统均把设备当成文件)。
  • /etc
    包含所有核心配置文件。这其中包括网络配置、系统名称、防火墙规则、用户、组,以及其他全局系统项。

/etc/group : 组用户信息;

/etc/passwd : 包含所有的用户信息,如密码,登录shell等;

/etc/fstab : 配置系统有哪些文件系统;

/etc/inittab : 配置init在不同运行级别下分别如何启动系统;

/etc/hosts : 域名解析的配置信息;

/etc/inetd.conf : 进程控制信息;

/etc/printcap:配置如何与打印机通信;

/etc/XF86Config:包含XFree86的初始配置;

  • /home: 用户主目录,每个用户都有自己的用户目录,位置为:/home/用户名。当然,root用户除外。
  • /lib: 这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的.dll文档。几乎任何的应用程式都需要用到这些共享库。
  • /lost+found: 这个目录平时是空的,当系统不正常关机后,这里就成了一些无家可归的文档的避难所。对了,有点类似于Dos下的.chk文档。
  • /mnt: 这个目录是空的,系统提供这个目录是让用户临时挂载别的文档系统。
  • /proc: 这个目录是个虚拟的目录,他是系统内存的映射,我们能够通过直接访问这个目录来获取系统信息。也就是说,这个目录的内容不在硬盘上而是在内存里.应该永远 不要备份这个目录。它不是一个真实的文件系统,而是运行内核和环境的虚拟化视图。它包括诸如 /proc/kcore 这样的文件,这个文件是整个运行内存的虚拟视图。备份这些文件只是在浪费资源。
  • /root : 是根(root)用户的主目录。
  • /opt : 是安装许多非系统文件的地方。IBM 软件就安装在这里。OpenOffice、JDK 和其他软件在默认情况下也安装在这里。
  • /usr: 这是个最庞大的目录,我们要用到的很多应用程式和文档几乎都存放在这个目录了。具体来说:
    /usr/X11R6:存放X-Windows的目录。
    /usr/bin:存放着许多应用程式.
    /usr/sbin:给终极用户使用的一些管理程式就放在这.
    /usr/doc:这就是Linux文档的大本营.
    /usr/include:Linux下研发和编译应用程式需要的头文档在这里找.
    /usr/lib:存放一些常用的动态链接共享库和静态档案库.
    /usr/local:这是提供给一般用户的/usr目录,在这安装软件最适合.
    /usr/man:是帮助文档目录.
    /usr/src:Linux开放的源代码,就存在这个目录,
  • /var: 这个目录中存放着那些不断在扩充着的东西,为了保持/usr的相对稳定,那些经常被修改的目录能够放在这个目录下,实际上许多系统管理员都是这样干的.顺 便说一下,系统的日志文档就在/var/log目录中. 包含系统守护进程(服务)所使用的信息,包括 DNS 配置、DHCP 租期、邮件缓冲文件、HTTP 服务器文件、db2 实例配置,等等。
  • /dev
    包含硬件设备的文件表示。如果计划还原到一个空白的系统,那就可以备份 /dev。然而,如果计划还原到一个已安装的 Linux 系统,那么备份 /dev 是没有必要的。