月度归档:2009年12月

好神奇啊~~

编译器真聪明,而且速度蛮快的。那么添加多几个是不是会变得慢呢?
复制多一些,看看情况。。。

这回无语了,编译了5分钟,结果还是内存达到2GB耗尽而终结。

博客搬家到美国了

现在博客使用一个美国宾夕法尼亚州的主机,所以不要惊讶访问本站的响应速度突然变得慢了很多。只是响应很迟钝,传输速度上还是没多大问题的,至少下载一个图片不会让你等很久。

为什么要把博客搬家呢?

也许很简单,因为现在用的是一个Linux服务器。现在用起来觉得比Windows安全很多。为什么呢?

其实也怪我笨。用了都快七八年的Windows操作系统,现在我对它的安全机制却一无所知。例如假设一个php的apache服务器,用webshell竟然可以对服务器硬盘意淫。

可能是我没有学过如何配置一个Windows Server。我菜鸟,我幸福!

也有可能而且很可能是Windows把太多东西都隐藏起来了而不让你们知道,所以我一直没有接触过。这就很好地解释了为什么那么多注入windows内幕之类的书呢。。。

总之,觉得Linux很好用。我不用windows也不仅仅是因为安全问题,至少我很长时间没有被XX捉弄过(4年来用同一个的盗版xp,还没有中国病毒,也没有重装过系统)。

现在的服务器装着CentOS,配置了一个专门运行服务器的受限用户,另外还给每个站点分配一个用户。运行程序可以方便地限制程序使用的内存,CPU,IO等资源,真好!

贴一下服务器的配置:
[xiaoxia@home ~]$ cat /proc/cpuinfo
processor     : 0
vendor_id     : GenuineIntel
cpu family     : 6
model         : 15
model name     : Intel(R) Xeon(R) CPU         X3220 @ 2.40GHz
stepping        : 11
cpu MHz         : 2400.090
cache size     : 4096 KB

processor     : 1
vendor_id     : GenuineIntel
cpu family     : 6
model         : 15
model name     : Intel(R) Xeon(R) CPU         X3220 @ 2.40GHz
stepping        : 11
cpu MHz         : 2400.090
cache size     : 4096 KB

[xiaoxia@home ~]$ cat /proc/meminfo
MemTotal:     1488000 kB
MemFree:     1303632 kB

内存好像是动态变化的,好神奇。但提供商说保证至少有512M。

别看这个CPU以为很强大的服务器了,更强大的见下图:

原来Linux和Windows下的socket还是有那么多不同的

之前以为linux和windows下的socket都是符合posix标准的,在一个环境下能够正常使用在另外一个环境也没问题。但没想到两者还是有那么多不同。

1.最先发现的是在windows上需要调用那个WSAStartup进行初始化才能使用socket。

2.linux下关闭socket用close,而windows上用closesocket。

3.后来发现shutdown的参数名称不同,windows上用SD_BOTH,linux上是SHUT_RDWR。

4.在linux下如果不正常关闭socket会触发SIGPIPE异常,所以我使用signal( SIGPIPE, SIG_IGN );忽略之。

5.linux下可以使用read,write函数操作socket,也可以使用send,recv。windows上只能使用send,recv?(不考虑udp的sendfrom和recvfrom)

今天又发现一个很大的不同点了,造成了homeserver在短时间内生成了一个20GB的日志文件,用完了vps的硬盘空间。如果一个正在使用中的socket使用close来关闭之而不调用shutdown,则该socket还是处于连接中,只是在进程的文件描述符中移除了(right?)所以导致了使用那个socket的线程一直没有收到关闭信号,阻塞在socket的recv上无法被关闭。而在windows上调用closesocket就彻底地断开了连接了。

下面是网上提供的信息:
close—–关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程还能用这个链接,能读或写这个socket id
shutdown–则破坏了socket 链接,读的时候可能侦探到EOF结束符,写的时候可能会收到一个SIGPIPE信号,这个信号可能直到socket buffer被填充了才收到,shutdown还有一个关闭方式的参数,0 不能再读,1不能再写,2 读写都不能。

所以,以后关闭socket还是同时使用shutdown和close好。

 

补充一下(2010-06-13):
1、在linux下,shutdown会引起在recv和send中阻塞的线程返回-1。但是在windows下,除非closesocket,否则线程仍然阻塞。

2、windows的描述符是递增的,linux的描述符是重用的。也就是说你在linux下关闭了描述符0,然后打开一个文件,这个文件就是用了描述符0。