Linux/Unix/Windows

fork()太奇葩了

《UNIX环境高级编程》说: “fork()调用一次,返回两次”。 这什么玩意儿? 作为Java程序员觉得很难理解。虽然书上提到了进程复制,但当时还是转不过弯来。这本书的例子代码里会判断fork()返回值的不同而分别执行父子进程的行为,搞得我更晕了,难道linux父子进程实际上是同一个进程? 后来看了一下《操作系统设计与实现》,才终于明白。 下面用代码解释一下。 /* fork()复制出的子进程跟当前进程所基于的代码一模一样,所以子进程也会执行下面的代码。不过,它不是从第一句开始执行的。 */ int main(){ /*下面这句只会执行一次,即只被父进程执行*/ printf("开始执行。当前进程的ID=%d\n", getpid()); int pid = fork(); /*这句会打印两次,说明子进程从这里开始执行*/ printf("调用fork()之后。当前进程的ID=%d\n", getpid()); /*下面两次打印出来的pid并不相同*/ if(pid > 0){ printf("fork()返回%d.当前进程是父进程,进程ID=%d\n", pid, getpid()); } if(pid == 0){ printf("fork()返回%d.当前进程是子进程,进程ID=%d\n", pid, getpid()); } /*下面这句会打印两次,父子进程都会执行*/ printf("程序准备退出。当前进程的ID=%d\n================\n", getpid()); }

获取所执行的程序所在目录及其上层目录的办法

抄自catalina.sh PRG="$0" # resolve links – $0 may be a softlink while [ -h "$PRG" ]; do ls=`ls -ld "$PRG"` link=`expr "$ls" : ‘.*-> \(.*\)$’` if expr "$link" : ‘/.*’ > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi done # 所执行程序所在的目录 PRGDIR=`dirname "$PRG"` # 所执行程序所在的目录的上级目录 [ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`

收藏几本关于unix编程的书

来自陈晧的 http://coolshell.cn/articles/4990.html 引用 学习Unix/Linux系统调用《Unix高级环境编程》,,了解系统层面的东西。 《Unix编程艺术》了解Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。你一定会有一种醍醐灌顶的感觉。 《Unix网络编程卷1,套接字》这是一本看完你就明白网络编程的书。重要注意TCP、UDP,以及多路复用的系统调用select/poll/epoll的差别。 《Unix网络编程卷2,进程间通信》信号量,管道,共享内存,消息等各种IPC…… 这些技术好像有点老掉牙了,不过还是值得了解。

linux下查看swap的状况

引用 $vmstat -1 然后关注其中的si和so列,它们分别代表swap in 和 swap out 或者使用top命令,如果发现buffer和free都接近0,则意味着swap正在激烈地投入使用。

为什么有的应用响应快Load却较高?

为什么有的应用响应快Load却很高? 响应快 => 排队少 => Load应该更低吧? 但今天比较了两个服务端应用,一个I/0比较多,响应比较慢,单核Load在0.7左右;另一个I/O比较少,响应非常快,单核Load却几乎达到了1.0 . 今天经高手指点,才终于明白。 I/O比较多的应用中,由于I/O阻塞,老是会有任务会被从队列里剔除,所以队列并不密集;而I/O较少的应用则相反。 如果把CPU队列比做一条高速路,汽车就是任务;任务发生I/O阻塞,相当于汽车发生故障,车子被暂时停到了路肩上。 对于I/O密集型的应用,路肩上停的车很多,路上跑的车却并不多,所以道路会感觉很松。 不过,响应快并不意味着Load就一定会高,两者没有简单的正比关系,必须具体情况具体分析。

服务器倒底应该容忍多高的Load ?

阮一峰翻译的一篇文章里说单CPU的Load超过了0.7就不好,接近1.0时就要想办法降下来。 而著名运维余洪春的观点是:单CPU的Load只要在3以下,都属于“系统性能良好”。 到底那种说法更靠谱? 首先,亲身经验表明第一种说法并不靠谱。对一个没什么I/O操作的应用来说,由于CPU开足马力为你服务,Load逼近1完全正常。 至于余洪春的说法,由于我自己经验不足,不敢说对还是错。 今天一个高手同事给出的观点是 [1.5, 2)范围内的load比较正常。 Load是等待队列和运行队列中的任务总和,一个运行、一个等,他认为是合乎性能要求的,我们的绝大多数应用也都是用这个值作为预警条件。

一个synergy辅助工具:在synergy服务端远程地启动客户端

作为Java开发人员,你每天通过Synergy使Linux台式机和笔记本协作时,可能会面临一个困扰: 每天启动台式机上的synergy c时,你都要去动下台式机的鼠标和键盘,在台式机中输入笔记本的IP,最后再启动syngergyc c. 下面这个工具就是可以让你在笔记本上启动台式机的syngergyc c,并连接笔记本上的synergy server; 这样一来,你就可以彻底不碰台式机了。 使用前提: 1. 你的Linux台式机中已安装Syngergc,且syngergc命令在path中。 2. 你的Linux台式机基本不关机 工具安装办法: 1. 在linux台式机中部署下面的java servlet应用 package kent.web.synergyutil; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SynergycServlet extends HttpServlet { private static final long serialVersionUID = -2286225907488120316L; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { …

一个synergy辅助工具:在synergy服务端远程地启动客户端 Read More »