??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人不卡亚洲精品91,亚洲人成影院在线高清,在线亚洲高清揄拍自拍一品区http://m.tkk7.com/shiliqiang/I'm on my way!zh-cnMon, 12 May 2025 17:57:30 GMTMon, 12 May 2025 17:57:30 GMT60l典的Linux Socket ~程 CZ代码 Q下Q?/title><link>http://m.tkk7.com/shiliqiang/archive/2009/11/17/302737.html</link><dc:creator>矛_@</dc:creator><author>矛_@</author><pubDate>Tue, 17 Nov 2009 13:14:00 GMT</pubDate><guid>http://m.tkk7.com/shiliqiang/archive/2009/11/17/302737.html</guid><wfw:comment>http://m.tkk7.com/shiliqiang/comments/302737.html</wfw:comment><comments>http://m.tkk7.com/shiliqiang/archive/2009/11/17/302737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/shiliqiang/comments/commentRss/302737.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shiliqiang/services/trackbacks/302737.html</trackback:ping><description><![CDATA[<font size="2" color="#000000"><span id="lhhfzjb" class="line"><br /> 摘自Qhttp://fanqiang.chinaunix.net/a4/b7/20010810/1200001101.html<br /> <br /> <br /> 在例Emain()函数快要l束Ӟ我们看到Q在服务器接受了客户机的q接h后,ؓ其创建子q程Qƈ在子q程中执行代理服务程序do_proxy()?br /> -----------------------------------------------------------------/**************************************************************** <br /> function:    do_proxy <br /> description:  does the actual work of virtually connecting a client to the telnet service on the          isolated host.<br /> arguments:   usersockfd socket to which the client is connected. return value: none.<br /> calls:     none. <br /> globals:     reads hostaddr. <br /> ****************************************************************/ <br /> void do_proxy (usersockfd) <br /> int usersockfd; <br /> { <br /> int isosockfd; <br /> fd_set rdfdset;<br /> int connstat;<br /> int iolen; <br /> char buf[2048]; <br /> /* open a socket to connect to the isolated host */ <br /> if ((isosockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) <br /> errorout("failed to create socket to host");<br /> /* attempt a connection */ <br /> connstat = connect(isosockfd,(struct sockaddr *) &hostaddr, sizeof(hostaddr)); <br /> switch (connstat) {<br /> case 0: <br /> break; <br /> case ETIMEDOUT: <br /> case ECONNREFUSED: <br /> case ENETUNREACH: <br /> strcpy(buf,sys_myerrlist[errno]); <br /> strcat(buf,"\r\n"); <br /> write(usersockfd,buf,strlen(buf)); <br /> close(usersockfd); <br /> exit(1); <br /> /* die peacefully if we can't establish a connection */<br /> break;<br /> default: <br /> errorout("failed to connect to host"); <br /> } <br /> /* now we're connected, serve fall into the data echo loop */ <br /> while (1) { <br /> /* Select for readability on either of our two sockets */ <br /> FD_ZERO(&rdfdset);<br /> FD_SET(usersockfd,&rdfdset);<br /> FD_SET(isosockfd,&rdfdset);<br /> if (select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL) < 0) <br /> errorout("select failed");<br /> /* is the client sending data? */<br /> if (FD_ISSET(usersockfd,&rdfdset)) { <br /> if ((iolen = read(usersockfd,buf,sizeof(buf))) <= 0) <br /> break; /* zero length means the client disconnected */ <br /> rite(isosockfd,buf,iolen); <br /> /* copy to host -- blocking semantics */ <br /> } <br /> /* is the host sending data? */ <br /> if (FD_ISSET(isosockfd,&rdfdset)) { <br /> f ((iolen = read(isosockfd,buf,sizeof(buf))) <= 0) <br /> break; /* zero length means the host disconnected */ <br /> rite(usersockfd,buf,iolen); <br /> /* copy to client -- blocking semantics */ <br /> } <br /> }<br /> /* we're done with the sockets */ <br /> close(isosockfd); <br /> lose(usersockfd);<br /> }<br /> -----------------------------------------------------------------<br /> ? 我们q段代理服务器例E中Q真正连接用户主机和q端L的一D|作,是p个do_proxy()函数来完成的。回想一下我们一开始对q段 proxyE序用法的介l。先我们的proxy与远端主机绑定,然后用户通过proxy的绑定端口与q端L建立q接。而在main()函数中,我们? proxy׃D|务器E序与用户主机徏立了q接Q而在q个do_proxy()函数中,proxy与q端L的相应服务端口(q户在命o行参C? 定)建立q接Qƈ负责传递用户主机和q端L之间交换的数据?br /> ׃要和q端L建立q接Q所以我们看到do_proxy()函数的前半部分实际上相当于一D|准的客户机程序。首先创Z个新的套接字描述W?isosockfdQ然后调用函数connect()与远端主Z间徏立连接。函数connect()的定义ؓQ?br /> -----------------------------------------------------------------<br /> #include <sys/types.h><br /> #include <sys/socket.h><br /> int connect(int sockfd, struct sockaddr *servaddr, int addrlen);<br /> -----------------------------------------------------------------<br /> 参数sockfd是调用函数socket()q回的套接字描述W,参数servaddr指向q程服务器的套接字地址l构Q参数addrlen指定q个 套接字地址l构的长度。函数connect()执行成功时返?0"Q如果执行失败则q回"-1"Qƈ全局变量errno讄为相应的错误cd。在例程 中的switch()函数调用中对以下三种出错cdq行了处理: ETIMEDOUT、ECONNREFUSED和ENETUNREACH。这三个出错cd的意思分别ؓQETIMEDOUT代表时Q生这U情늚原因 有很多,最常见的是服务器忙Q无法应{客h的连接请求;ECONNREFUSED代表q接拒绝Q即服务器端没有准备好的們֐套接字,或是没有对們֐套接 字的状态进行监听;ENETUNREACH表示|络不可达?br /> 在本例中Qconnect()函数的第二个参数servaddr是全局变量hostaddrQ其中存储着函数parse_args()转换好的命o? 参数。如果连接徏立失败,在例E中p用我们自定义的函数errorout()输出信息"failed to connect to host"。errorout()函数的定义ؓQ?br /> -----------------------------------------------------------------<br /> /**************************************************************** <br /> function:  errorout <br /> description: displays an error message on the console and kills the current process. <br /> arguments:  msg -- message to be displayed. <br /> return value: none -- does not return. <br /> calls:    none. <br /> globals:   none. <br /> ****************************************************************/ <br /> void errorout (msg) <br /> char *msg; <br /> { <br /> FILE *console;<br /> console = fopen("/dev/console","a"); <br /> fprintf(console,"proxyd: %s\r\n",msg); <br /> fclose(console); <br /> exit(1); <br /> }<br /> -----------------------------------------------------------------<br /> do_proxy()函数的后半部分是通过proxy建立用户L与远端主Z间的q接。我们既有proxy与用户主接的套接? Qdo_proxy()函数的参数usersockfdQ,又有proxy与远端主接的套接字isosockfdQ那么最单直接的通信建立方式是 从一个套接字读,然后直接写到另一个套接字厅R如Q?br /> -----------------------------------------------------------------<br /> int n;<br /> char buf[2048];<br /> while((n=read(usersockfd, buf, sizeof(buf))>0)<br /> if(write(isosockfd, buf, n)!=n)<br /> err_sys("write wrror\n");<br /> -----------------------------------------------------------------<br /> q种形式的阻塞I/O在单向数据传递的时候是非常有效的,但是在我们的proxy操作中是要求用户L和远端主机双向通信的,q样p求我们对两个? 接字描述W既能够ȝ能够写。如果还是采用这U方式的dI/O的话Q很有可能长旉d在一个描q符上。因此例E在处理q个问题的时候调用了 select()函数Q这个函数允许我们执行I/O多\转接。其具体含义是select()函数可以构造一个表Q在q个表中包含了我们所有要用到的文? 描述W。然后我们可以调用一个函敎ͼq个函数可以这些文件描q符的状态,当某个(我们指定的)文g描述W准备好q行I/O操作Ӟ此函数就q回Q告? q程哪个文g描述W已l可以执行I/O操作了。这样就避免了长旉的阻塞?br /> q有一个函数poll()可以实现I/O多\转接Q由于在例程中调用的是select()Q我们就只对select()q行一下比较详l的介绍。select()pd函数的详l描qCؓQ?br /> -----------------------------------------------------------------<br /> #include <sys/time.h><br /> #include <sys/types.h><br /> #include <unistd.h><br /> int select(int n, fd_set *readfds, fd_set *writefds, fd_est *exceptfds, struct timeval *timeout);<br /> FD_CLR(int fd, fd_set *set);<br /> FD_ISSET(int fd, fd_set *set);<br /> FD_SET(int fd, fd_set *set);<br /> FD_ZERO(fd_set *set);<br /> -----------------------------------------------------------------<br /> select()函数创Z个我们所兛_的文件描q符表,它的参数在内核中ؓq些文g描述W设|我们所兛_的条Ӟ例如是否是可诅R是否可写以? 是否异常Q而且在参Cq可以设|我们希望等待的最大时间。在select()成功执行Ӟ它将q回目前已经准备好的描述W数量,同时内核可以告诉我们? 个描q符的状态信息。如果超Ӟ则返?0"Q如果出错,则函数返?-1"Qƈ同时讄errno为相应的倹{?br /> select()的最后一个参数timeout设|等待时间。其中结构timeval是在文g<bits/time.h>中定义的?br /> -----------------------------------------------------------------<br /> struct timeval<br /> {<br /> __time_t tv_sec; /* Seconds */<br /> __time_t tv_usec; /* Microseconds */<br /> };<br /> -----------------------------------------------------------------<br /> 参数timeout的设|有三种情况。象例程中这样timeout==NULLӞq表C用户希望永q等待,直到我们指定的文件描q符中的一个已准备 好,或者是捕捉C个信受如果是׃捕捉C可中断了q个无限期的{待q程的话Qselect()返?-1"Q同时设|errno的gؓ EINTR?br /> 如果timeout->tv_sec==0&&timeout->tv_usec==0Q那么这表示完全不等待?Select()试了所有指定文件描q符后立卌回。这是得到多个描q符状态而不dselect()函数的轮询方法?br /> 如果timeout->tv_secQ?0||timeout->tv_usecQ?0Q那么这两个参数的值即为我们希望函数等待的? 间。其中tv_sec讄旉单位为秒Qtv_usec讄旉单位为微U。如果在时的时候,在我们指定的所有文件描q符里面仍然没有M一个准备好? 话,则select()返?0"?br /> 中间三个参数的数据类型是fd_setQ它的意思是文g描述W集Q而readfds, writefds和exceptfds则分别是指向文g描述W集的指针,他们分别描述了我们所兛_的可诅R可写以及状态异常的各个文g描述W。之所以我? Uselect()可以创徏一个文件描q符"?Q那个所谓的表就是由q三个参数指向的数据l构l成的。其具体l构如图1所C。其中在每个set_fd? 据类型中都ؓ我们兛_的所有文件描q符保留了一位。所以在监测文g描述W状态的时候,在q些set_fd数据l构中查询相关的位?br /> W一个参数n用来说明到底需要遍历多个描述W位。n的g般是q样讄的,从我们关心的所有文件描q符中选出最大值再?。例如我们设|的所有文? 描述W中最大的?Q那么将n讄?Q则pȝ在检描q符状态的时候,只用遍历前7位(fd0~fd6Q的状态。不q如果不惌样麻烦的话,我们可以 象例E中那样n的值直接设|ؓFD_SETSIZE。这是系l中讑֮的最大文件描q符个数Q不同的pȝq个g不相同,一般是256或是1024。这? 在检描q符状态的时候,函数遍历所有的描述W位?br /> 在调用select()函数实现多\I/O转接Ӟ首先我们要声明一个新的文件描q符集,p例程中这P<br /> fd_set rdfdset;<br /> 然后调用FD_ZERO()清空此文件描q符集的所有位Q以免下面检描q符位的时候返回错误结果:<br /> FD_ZERO(&rdfdset);<br /> 然后调用FD_SET()在文件描q符集中讄我们兛_的位。在本例中,我们兛_的就是分别与用户L和远端主接的两个套接字描q符Q所以执行这L语句Q?br /> FD_SET(usersockfd,&rdfdset);<br /> FD_SET(isosockfd,&rdfdset);<br /> 然后调用select()q回描述W状态,此时描述W状态被存储q描q符集,也就是set_fd数据l构中。在?中我们看到所有的描述W位状态都? "0"Q在select()q回后,例如fd0可读Q则在readfds描述W集中fd0对应的位上将状态标志设|ؓ"1"Q如果fd1可写Q则 writefds描述W集中fd1对应的位上将状态标志设|ؓ"1"Q状态异常的情况也也与此相同。在本例中,我们只关心两个套接字描述W是否可写,因此 执行q样的select()函数Q?br /> select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL)<br /> 那么在select()q回后怎样set_fd数据l构中描q符位的状态呢Q这p调用函数FD_ISSET()Q如果对应文件描q符的状态ؓ"已准备好"Q即描述W位?1"Q,则FD_ISSET()q回"1"Q否则返?0"?br /> -----------------------------------------------------------------<br /> if (FD_ISSET(usersockfd,&rdfdset)) { <br /> if ((iolen = read(usersockfd,buf,sizeof(buf))) <= 0) <br /> break; /* zero length means the host disconnected */<br /> write(isosockfd,buf,iolen);<br /> -----------------------------------------------------------------<br /> q一D代码就实现从套接字usersockfdQ用户主机)到套接字isosockfdQ远端主机)的无d传输。而下一D代码实现反方向的无d传输Q?br /> -----------------------------------------------------------------<br /> if (FD_ISSET(isosockfd,&rdfdset)) { <br /> if ((iolen = read(isosockfd,buf,sizeof(buf))) <= 0) <br /> break; /* zero length means the host disconnected */ <br /> write(usersockfd,buf,iolen); <br /> -----------------------------------------------------------------<br /> q样通过proxy实现了用户主Zq端L之间的通信?br /> 对这Dproxy代码我只是写了一些自q理解Q大多数是一些函数的用法Q这些都是linux|络~程中一些最基础的知识,如果有不对的地方Q还请各位大虾批评指正?br /> <br /> <br /> <br /> <br /> <br /> </span></font> <img src ="http://m.tkk7.com/shiliqiang/aggbug/302737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shiliqiang/" target="_blank">矛_@</a> 2009-11-17 21:14 <a href="http://m.tkk7.com/shiliqiang/archive/2009/11/17/302737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l典的Linux Socket ~程 CZ代码 Q上Q?/title><link>http://m.tkk7.com/shiliqiang/archive/2009/11/17/302736.html</link><dc:creator>矛_@</dc:creator><author>矛_@</author><pubDate>Tue, 17 Nov 2009 13:13:00 GMT</pubDate><guid>http://m.tkk7.com/shiliqiang/archive/2009/11/17/302736.html</guid><wfw:comment>http://m.tkk7.com/shiliqiang/comments/302736.html</wfw:comment><comments>http://m.tkk7.com/shiliqiang/archive/2009/11/17/302736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/shiliqiang/comments/commentRss/302736.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shiliqiang/services/trackbacks/302736.html</trackback:ping><description><![CDATA[<p><font size="2"><strong>http://fanqiang.chinaunix.net/a4/b7/20010810/1200001101.html<br /> </strong></font></p> <p><font size="2"><strong><br /> </strong></font></p> <p><font size="2"><strong>Linux</strong>是一个可靠性非帔R的操作系l,但是所有用qLinux的朋友都会感 觉到Q? Linux和Windowsq样?ȝ"操作pȝQ这里丝毫没有贬低Windows的意思,相反q应该是Windows的优点)相比Q后者无疑在易操? 性上更胜一{V但是ؓ什么又有那么多的爱好者钟情于Linux呢,当然自由是最吸引人的一点,另外Linux强大的功能也是一个非帔R要的原因Q尤其是 Linux强大的网l功能更是引人注目。放g天的WAP业务、银行网l业务和曄U透半边天的电子商务,都越来越倚重ZLinux的解x案。因? Linux|络~程是非帔R要的Q而且当我们一接触到Linux|络~程Q我们就会发现这是一仉常有意思的事情Q因Z前一些关于网l通信概念似是而非 的地方,在这一D|代码面前马上p然开朗了。在刚开始学习编E的时候L让h感觉有点理不清头l,不过只要多读几段代码Q很快我们就能体会到其中的乐? 了。下面我׃一DProxy源代码开始,谈谈如何q行Linux|络~程?</font></p> <p><span id="xdbdrjj" class="line"><font size="2">   首先声明Q这D|代码不是我编写的Q让我们感谢q位名叫Carl Harris的大虾,是他~写了这D代码ƈ其散播到网上供大家学习讨论。这D代码虽然只是描qC最单的proxy操作Q但它的是l典Q它不仅清晰? 描述了客h/服务器系l的概念Q而且几乎包括了Linux|络~程的方斚w面,非常适合Linux|络~程的初学者学习?br /> q段ProxyE序的用法是q样的,我们可以使用q个proxyd其它L的服务端口。假如编译后生成了名为Proxy的可执行文gQ那么命令及其参数的描述为:<br /> ./Proxy <proxy_port> <remote_host> <service_port><br /> 其中参数proxy_port是指由我们指定的代理服务器端口。参数remote_host是指我们希望q接的远E主机的L名,IP地址也同h 效。这个主机名在网l上应该是唯一的,如果您不定的话Q可以在q程L上用uname -n命o查看一下。参数service_port是远E主机可提供的服务名Q也可直接键入服务对应的端口受这个命令的相应操作是将代理服务器的 proxy_port端口l定到remote_host的service_port端口。然后我们就可以通过代理服务器的proxy_port端口讉K remote_host了。例如一台计机Q网l主机名是legendsQIP地址?0.10.8.221Q如果在我的计算Z执行Q?br /> [root@lee /root]#./proxy 8000 legends telnet<br /> 那么我们可以通过下面q条命o讉Klegends的telnet端口?br /> -----------------------------------------------------------------<br /> [root@lee /root]#telnet legends 8000<br /> Trying 10.10.8.221...<br /> Connected to legends(10.10.8.221).<br /> Escape character is '^]'</font></span></p> <p><font size="2"><span id="lhjrpfd" class="line">Red Hat Linux release 6.2(Zoot)<br /> Kernel 2.2.14-5.0 on an i686<br /> Login:<br /> -----------------------------------------------------------------<br /> 上面的绑定操作也可以使用下面的命令:<br /> [root@lee /root]#./proxy 8000 10.10.8.221 23<br /> 23是telnet服务的标准端口号Q其它服务的对应端口h们可以在/etc/services中查看?br /> <br /> 下面我就从这D代码出发谈谈我对Linux|络~程的一些粗的认识Q不对的地方q请各位大虾多多批评指正?/span></font></p> <p><font size="2"><span id="jdhlpft" class="line">◆main()函数<br /> -----------------------------------------------------------------<br /> #include <stdio.h> <br /> #include <ctype.h> <br /> #include <errno.h> <br /> #include <signal.h> <br /> #include <sys/types.h> <br /> #include <sys/socket.h> <br /> #include <sys/file.h> <br /> #include <sys/ioctl.h> <br /> #include <sys/wait.h> <br /> #include <sys/types.h> <br /> #include <netdb.h> <br /> #define TCP_PROTO   "tcp" <br /> int proxy_port;    /* port to listen for proxy connections on */ <br /> struct sockaddr_in hostaddr;   /* host addr assembled from gethostbyname() */ <br /> extern int errno;   /* defined by libc.a */ <br /> extern char *sys_myerrlist[]; <br /> void parse_args (int argc, char **argv); <br /> void daemonize (int servfd); <br /> void do_proxy (int usersockfd); <br /> void reap_status (void); <br /> void errorout (char *msg);<br /> /*This is my modification. <br /> I'll tell you why we must do this later*/<br /> typedef void Signal(int);<br /> /****************************************************************<br /> function:    main <br /> description:   Main level driver. After daemonizing the process, a socket is opened to listen for         connections on the proxy port, connections are accepted and children are spawned to         handle each new connection. <br /> arguments:    argc,argv you know what those are. <br /> return value:  none. <br /> calls:      parse_args, do_proxy. <br /> globals:     reads proxy_port. <br /> ****************************************************************/<br /> main (argc,argv) <br /> int argc; <br /> char **argv; <br /> { <br /> int clilen; <br /> int childpid; <br /> int sockfd, newsockfd; <br /> struct sockaddr_in servaddr, cliaddr; <br /> parse_args(argc,argv); <br /> /* prepare an address struct to listen for connections */ <br /> bzero((char *) &servaddr, sizeof(servaddr)); <br /> servaddr.sin_family = AF_INET; <br /> servaddr.sin_addr.s_addr = htonl(INADDR_ANY); <br /> servaddr.sin_port = proxy_port; <br /> /* get a socket... */ <br /> if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) { <br /> fputs("failed to create server socket\r\n",stderr); <br /> exit(1); <br /> } <br /> /* ...and bind our address and port to it */ <br /> if   (bind(sockfd,(struct sockaddr_in *) &servaddr,sizeof(servaddr)) < 0) { <br /> fputs("faild to bind server socket to specified port\r\n",stderr); <br /> exit(1); <br /> } <br /> /* get ready to accept with at most 5 clients waiting to connect */ <br /> listen(sockfd,5); <br /> /* turn ourselves into a daemon */ <br /> daemonize(sockfd); <br /> /* fall into a loop to accept new connections and spawn children */ <br /> while (1) {<br /> /* accept the next connection */ <br /> clilen = sizeof(cliaddr); <br /> newsockfd = accept(sockfd, (struct sockaddr_in *) &cliaddr, &clilen); <br /> if (newsockfd < 0 && errno == EINTR) <br /> continue; <br /> /* a signal might interrupt our accept() call */ <br /> else if (newsockfd < 0) <br /> /* something quite amiss -- kill the server */ <br /> errorout("failed to accept connection");<br /> /* fork a child to handle this connection */ <br /> if ((childpid = fork()) == 0) { <br /> close(sockfd); <br /> do_proxy(newsockfd); <br /> exit(0); <br /> } <br /> /* if fork() failed, the connection is silently dropped -- oops! */ <br /> lose(newsockfd); <br /> } <br /> }<br /> -----------------------------------------------------------------<br /> 上面是Proxy源代码的ȝ序部分,也许您在|上也曾l看到过q段代码Q不q细心的您会发现在上面这D代码中我修改了两个地方Q都是在预编译部分。一个地Ҏ在定义外部字W型指针数组Ӟ我将原代码中?br /> extern char *sys_errlist[];<br /> 修改?br /> extern char *sys_myerrlist[];原因是在我的Linux环境下头文g"stdio.h"已经对sys_errlist[]q行了如下定义:<br /> extern __const char *__const sys_errlist[];<br /> 也许Carl Harris?4q编写这D代码时pȝq没有定义sys_errlist[]Q不q现在我们不修改一下的话,~译时系l就会告诉我们sys_errlist发生了定义冲H?br /> 另外我添加了一个函数类型定义:<br /> typedef void Sigfunc(int);<br /> 具体原因我将在后面向大家解释?/span></font></p> <p><font size="2"><span id="dfrnhpz" class="line"><strong>套接字和套接字地址l构定义</strong></span></font></p> <p><font size="2"><span id="tvrlpnt" class="line"> q段ȝ序是一D典型的服务器程序。网l通讯最重要的就是套接字的用,在程序的一开始就对套接字描述Wsockfd和newsockfdq行了定义? 接下来定义客h/服务器的套接字地址l构cliaddr和servaddrQ存储客h/服务器的有关通信信息。然后调用parse_args (argc,argv)函数处理命o参数。关于这个parse_args()函数我们待会儿再做介l?/span></font></p> <p><font size="2"><span id="tdhjtbh" class="line"><strong>创徏通信套接?/strong></span></font></p> <p><font size="2"><span id="tvhlnvj" class="line">  下面是建立一个服务器的详l过E。服务器E序的第一个操作是创徏一个套接字。这是通过调用函数socket()来实现的。socket()函数的具体描qCؓQ?br /> -----------------------------------------------------------------<br /> #include <sys/types.h><br /> #include <sys/socket.h><br /> int socket(int domain, int type, int protocol);<br /> -----------------------------------------------------------------<br /> 参数domain指定套接字用的协议族,AF_INET表示使用TCP/IP协议族,AF_UNIX表示使用Unix协议族,AF_ISO表示套接 字用ISO协议族。type指定套接字类型,一般的面向q接通信cdQ如TCPQ设|ؓSOCK_STREAMQ当套接字ؓ数据报类型时Qtype应设 |ؓSOCK_DGRAMQ如果是可以直接讉KIP协议的原始套接字则type应设|ؓSOCK_RAW。参数protocol一般设|ؓ"0"Q表CZ 用默认协议。当socket()函数成功执行Ӟq回一个标志这个套接字的描q符Q如果出错则q回"-1"Qƈ讄errno为相应的错误cd?/span></font></p> <p><font size="2"><span id="ptnxtzh" class="line"><strong>讄服务器套接字地址l构</strong></span></font></p> <p><font size="2"><span id="vhdxrxp" class="line"> 在通常情况下,首先要将描述服务器信息的套接字地址l构清零Q然后在地址l构中填入相应的内容Q准备接受客h送来的连接徏立请求。这个清零操作可以用 多种字节处理函数来实玎ͼ例如bzero()、bcopy()、memset()、memcpy(){,以字?b"开始的两个函数是和BSDpȝ兼容 的,而后面两个是ANSI C提供的函数。这D代码中使用的bzero()其描qCؓQ?br /> void bzero(void *s, int n);<br /> 函数的具体操作是参数s指定的内存的前n个字节清零。memset()同样也很常用Q其描述为:<br /> void *memset(void *s, int c, size_t n);<br /> 具体操作是将参数s指定的内存区域的前n个字节设|ؓ参数c的内宏V?br /> 下一步就是在已经清零的服务器套接字地址l构中填入相应的内容。Linuxpȝ的套接字是一个通用的网l编E接口,它应该支持多U网l通信协议Q每一 U协议都使用专门己定义的套接字地址l构Q例如TCP/IP|络的套接字地址l构是struct sockaddr_inQ。不qؓ了保持套接字函数调用参数的一致性,Linuxpȝq定义了一U通用的套接字地址l构Q?br /> -----------------------------------------------------------------<br /> <linux/socket.h><br /> struct sockaddr<br /> {<br /> unsigned short sa_family; /* address type */<br /> char sa_data[14]; /* protocol address */<br /> }<br /> -----------------------------------------------------------------<br /> 其中sa_family意指套接字用的协议族地址cdQ对于我们的TCP/IP|络Q其值应该是AF_INETQsa_data中存储具体的协议? 址Q不同的协议族有不同的地址格式。这个通用的套接字地址l构一般不用做定义具体的实例,但是常用做套接字地址l构的强制类型{换,如我们经常可以看到这 L用法Q?br /> bind(sockfd,(struct sockaddr *) &servaddr,sizeof(servaddr))<br /> 用于TCP/IP协议族的套接字地址l构是sockaddr_inQ其定义为:<br /> -----------------------------------------------------------------<br /> <linux/in.h><br /> struct in_addr<br /> {<br /> __u32 s_addr;<br /> };<br /> struct sochaddr_in<br /> {<br /> short int sin_family;<br /> unsigned short int sin_port;<br /> struct in_addr sin_addr;<br /> /*This part has not been taken into use yet*/<br /> nsigned char_ _ pad[_ _ SOCK_SIZE__- sizeof(short int) -sizeof(unsigned short int) -       sizeof(struct in_addr)];<br /> };<br /> #define sin_zero_ - pad<br /> -----------------------------------------------------------------<br /> 其中sin_zero成员q未使用Q它是ؓ了和通用套接字地址struct sockaddr兼容而特意引入的。在~程Ӟ一般都通过bzero()或是memsetQ)其|零。其他成员的讄一般是q样的:<br /> servaddr.sin_family = AF_INET;<br /> 表示套接字用TCP/IP协议族?br /> servaddr.sin_addr.s_addr = htonl(INADDR_ANY);<br /> 讄服务器套接字的IP地址为特D值INADDR_ANYQ这表示服务器愿意接收来自Q何网l设备接口的客户接。htonl()函数的意思是主机顺序的字节转换成网l顺序的字节?br /> servaddr.sin_port = htons(PORT);<br /> 讄通信端口PPORT应该是我们已l定义好的。在本例中servaddr.sin_port = proxy_port;q是表示端口h函数的返回值proxy_port?br /> 另外需要说明的一ҎQ在本例中,我们q没有看到在预编译部分中包含?lt;linux/socket.h>?lt; linux/in.h>q两个头文gQ那是因两个头文件已l分别被包含?lt;sys/types.h>?lt; sys/types.h>中了Q而且后面q两个头文g是与q_无关的,所以在|络通信中一般都使用q两个头文g?/span></font></p> <p><font size="2"><span id="zfbvfnt" class="line"><strong>服务器公开地址</strong></span></font></p> <p><font size="2"><span id="xtnfbzp" class="line">  如果服务器要接受客户机的q接hQ那么它必须先要在整个网l上公开自己的地址。在讄了服务器的套接字地址l构之后Q可以通过调用函数bind()l定服务器的地址和套接字来完成公开地址的操作。函数bind()的详l描qCؓQ?br /> -----------------------------------------------------------------<br /> #include <sys/types.h><br /> #include <sys/socket.h><br /> int bind(int sockfd, struct sockaddr *addr, int addrlen);<br /> -----------------------------------------------------------------<br /> 参数sockfd是我们通过调用socket()创徏的套接字描述W。参数addr是本机地址Q参数addrlen是套接字地址l构的长度。函数执行成功时q回"0",否则q回"-1"Qƈ讄errno变量为EADDRINUAER?br /> 如果是服务器调用bind()函数Q如果设|了套接字的IP地址为某个本地IP地址Q那么这表示服务器只接受来自于这个IP地址的特定主机发出的q接 h。不q一般情况下都是IP地址讄为INADDR_ANYQ以便接受所有网l设备接口送来的连接请求?br /> 客户Z般是不会调用bind()函数的,因ؓ客户机在q接时不用指定自q套接字地址端口Ppȝ会自动ؓ客户机选择一个未用端口号Qƈ且用本地 IP地址自动填充客户机套接字地址l构中的相应V但是在某些特定的情况下客户机需要用特定的端口P例如Linux中的rlogin命op求用保 留端口号Q而系l是不能为客h自动分配保留端口LQ这需要调用bind()来绑定一个保留端口号了。不q在一些特D的环境下,q样l定特定端口号也 会带来一些负面媄响,如在HTTP服务器进入TIME_WAIT状态后Q客h如果要求再次与服务器建立q接Q则服务器会拒绝q一q接h。如果客h最 后进入TIME_WAIT状态,则马上再ơ执行bindQ)函数时会q回出错信息"-1"Q原因是pȝ会认为同时有两次q接l定同一个端口?/span></font></p> <p><font size="2"><span id="nfrlxfd" class="line"><strong>转换Listening套接?/strong><br /> <br /> 接下来,服务器需要将我们刚才与IP地址和端口号完成l定的套接字转换成們֐listening套接字。只有服务器E序才需要执行这一步操作。我们通过调用函数listen()实现q一操作。listen()的详l描qCؓQ?br /> -----------------------------------------------------------------<br /> #include <sys/socket.h><br /> int listen(int sockfd, int backlog);<br /> -----------------------------------------------------------------<br /> 参数sockfd指定我们要求转换的套接字描述W,参数backlog讄h队列的最大长度。函数listen()主要完成以下操作?br /> 首先是将套接字{换成們֐套接字。因为函数socket()创徏的套接字都是d套接字,所以客h可以通过调用函数connect()来用这L 套接字主动和服务器徏立连接。而服务器的情冉|恰相反,服务器需要通过套接字接收客h的连接请求,q就需要一?被动"套接字。listen()可? 一个尚未连接的d套接字{换成L"被动"套接字,也就是們֐套接字。在执行了listen()函数之后Q服务器的TCPqCLOSED变成 LISTEN状态了?br /> 另外listen()可以讄q接h队列的最大长度。虽然参数backlog的用法非常简单,只是一个简单的整数。但搞清楚请求队列的含义对理解TCP 协议的通信q程建立非常重要。TCP协议为每个們֐套接字实际上l护两个队列Q一个是未完成连接队列,q个队列中的成员都是未完?ơ握手的q接Q另一? 是完成连接队列,q个队列中的成员都是虽然已经完成?ơ握手,但是q未被服务器调用accept()接收的连接。参数backlog实际上指定的是这? 們֐套接字完成连接队列的最大长度。在本例中我们是q样用的Qlisten(sockfd,5);表示完成q接队列的最大长度ؓ5?/span></font></p> <p><font size="2"><span id="lvzdfll" class="line"><strong>接收q接</strong><br /> <br /> 接下来我们在ȝ序中看到通过名ؓdaemonize()的自定义函数创徏一个守护进E,关于q个daemonize()以及守护q程的相x念,? 们等一会儿再做详细介绍。然后服务器E序q入一个无条g循环Q用于监听接收客h的连接请求。在此过E中如果有客h调用connect()hq接Q那 么函数accept()可以从們֐套接字的完成q接队列中接受一个连接请求。如果完成连接队列ؓI,q个q程q眠。accept()的详l描qCؓQ?br /> -----------------------------------------------------------------<br /> #include <sys/socket.h><br /> int accept(int sockfd, struct sockaddr *addr, int *addrlen);<br /> -----------------------------------------------------------------<br /> 参数sockfd是我们{换成功的們֐套接字描q符Q参数addr是一个指向套接字地址l构的指针,参数addrlenZ个整型指针。当函数成功? 行时Q返?个结果,函数q回一个新的套接字描述W,服务器可以通过q个新的套接字描q符和客hq行通信。参数addr所指向的套接字地址l构中将存放 客户机的相关信息Qaddrlen指针描q前q套接字地址l构的长度。在通常情况下服务器对这些信息不是很感兴,因此我们l常可以看到一些源代码中将 accept()函数的后两个参数都设|ؓNULL。不q在q段proxy源代码中需要用到有关的客户Z息,因此我们看到通过执行<br /> newsockfd = accept(sockfd, (struct sockaddr_in *) &cliaddr, &clilen);<br /> 客h的详l信息存攑֜地址l构cliaddr中。而proxy通过套接字newsockfd与客hq行通信。值得注意的是q个q回的套接字? q符与我们{换的們֐套接字是不同的。在一D|务器E序中,可以始终只用一个們֐套接字来接收多个客户机的q接hQ而如果我们要和客h建立一个实际的 q接的话Q对每一个请求我们都需要调用accept()q回一个新的套接字。当服务器处理完毕客h的请求后Q一定要相应的套接字关闭;如果整个服务? E序要l束Q那么一定要們֐套接字关闭?br /> 如果accept()函数执行p|Q则q回"-1"Q如果accept()函数d{待客户用connect()建立q接Q进E在此时恰好捕捉? 信号Q那么函数在q回"-1"的同时将变量errno的D|ؓEINTR。这和accept()函数执行p|是有区别的。因此我们在代码中可以看到这? 的语句:<br /> -----------------------------------------------------------------<br /> if (newsockfd < 0 && errno == EINTR) <br /> continue; <br /> /* a signal might interrupt our accept() call */ <br /> else if (newsockfd < 0) <br /> /* something quite amiss -- kill the server */ <br /> errorout("failed to accept connection");<br /> -----------------------------------------------------------------<br /> 可以看出E序在处理这两种情况时操作是完全不同的,同样是accept()q回"-1"Q如果有errno == EINTRQ那么系l将再次调用accept()接受q接hQ否则服务器q程直接结束?/span></font></p> <img src ="http://m.tkk7.com/shiliqiang/aggbug/302736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shiliqiang/" target="_blank">矛_@</a> 2009-11-17 21:13 <a href="http://m.tkk7.com/shiliqiang/archive/2009/11/17/302736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unix发展?/title><link>http://m.tkk7.com/shiliqiang/archive/2009/11/15/302422.html</link><dc:creator>矛_@</dc:creator><author>矛_@</author><pubDate>Sun, 15 Nov 2009 07:56:00 GMT</pubDate><guid>http://m.tkk7.com/shiliqiang/archive/2009/11/15/302422.html</guid><wfw:comment>http://m.tkk7.com/shiliqiang/comments/302422.html</wfw:comment><comments>http://m.tkk7.com/shiliqiang/archive/2009/11/15/302422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/shiliqiang/comments/commentRss/302422.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shiliqiang/services/trackbacks/302422.html</trackback:ping><description><![CDATA[<font id="zoom" class="zw_txt"><strong>先前的一个理?/strong> <br /> UNIXpȝ?1969 q?Ken ThompsonKen Thompson ?Dennis RitchieDennis Ritchie 在美国贝电话实验室QBell Telephone Laboratories Q发展出雏Ş至今Q已历经q?30 来年。?"UNIX" q个字典上查不到其原意的怪字Q其实是戏谑 MULTICSQMULTiplexed Information and Computing SystemQ操作系l的大而无当所产生的谐韛_?<br /> ?1957 q?10 月,前苏联发了W一枚h造卫星,此D让当时的国ȝ艾森豪威决定投下巨额的l费用以支持及发展科学,国高等研究计划|? QARPAQAdvanced Research Projects Agency Q便是在q个时空下设立了Q该单位负责推动pȝ发展{相兌划,成ؓ当时国电子计算器发展的重要推手?<br /> 1960q代是大型计机的发展年代,当时的麻省理工学院因最先实C兼容分时pȝQCTSSQ?Compatible Time-Sharing SystemQ,在电子计器领域享有相当崇高的地位?<br /> 1963q_ȝ理工的里克莱PJ. C. R. LickliderQ?915~1990 Q?<br /> 推动?MAC计划QMAC ?IBM的大型计机做ؓMQ连接了近 160台终端机Q这些终端机四散在学区以及教职员的家中Q可以让 30 位用者同时共享计机资源。这计划到?1965 q便不堪负荷Q于是麻省理工便军_开发更大型的分时计机pȝ。新的计划便是—? MULTICS. 一个计机 <br /> 史上最为庞大的分时计算机系l,企图q接 1000 部终端机Q支?300位用者同时上U的分时计算机系l。她面的是Q操作系l的分时观念q在各学术与研究机构探烦成Ş中,计算机硬件亦需重新设计的双重挑战?<br /> 当时Q麻省理工原本找 IBM来配合这计划,?IBM正忙着应付自己的问题而无意配合MULTICS 计划。此Ӟ通用电子公司QGeneral Electric CompanyQ?<br /> 也就是奇异公司正好在发展自己的大型主机,见机不可失,便极力邀请麻省理工参予她们的 GE 645 大型L的规格制定。有了奇异热心主动的计算机硬仉合,ȝ理工找上的不能贩售计机却h才济的贝尔电话实验室来负责承包软g工程。于? 乎,MULTICS 的计划便?1965 q由ȝ理工学院、奇异公司及贝尔电话实验室这三个成员开始共同发展?<br /> 1969q_MULTICS 计划在历l四q的奋战后,仍旧未达到原先规划设计的理想Q贝电话实验室军_退划。功能未辑֎始设计理想的 MULTICSq是安装在奇异公司的 GE 645 大型计算Z供麻省理工用。奇异公司在该计划草草结束后不到一q便完全淡出大型计算机市场。日后,MULTICS 计划被嘲解ؓMany Unnecessarily Large Table In Core Simultaneously. <br /> 农夫我个为, MULTICS计划诞生在大型计机开始鼎沸的 1965 q_夭折于大型计机最煌的 1969 q。她如果适时? 1960 q代末期成功的话Q绝对可以助长当时已l普遍被计算机权威h士视为理想的「计机公用事业」,臛_可以让大型计机的发展与资源集中的应用模式就不至于会 ?1970 q代初期p速萎~。因?MULTICS计划如果成功Q至能让当时的大型计算机的应用规模大上 10 倍左叟뀂然而,MULTICS 计划p|了。她严重地打M当时依赖大型计算Z机的计算机公用事业业者在发展上的信心。更׃没有怼的计划后l进行,使得集中式的大型计算Z机没? 明显的用效能提升,而加速催化计器工业的{变,以寻找新的道路。另一斚wQMULTICS 计划p|的经验亦让当时参与该计划的Y件工E师们得到相当宝늚l验与正面的影响?<br /> 几年后,在 AT&T QMULTICS 计划q个不同凡响的失败换来的一个不同凡响的成功?<br /> 一个戏谑她的名字诞生了…… UNIX. <br /> Ken_Thompso<br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M10351425013001.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351425013001.jpg');" border="0"><br /> Dennis_Ritchie<br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M103514N021A4.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M103514N021A4.jpg');" border="0"><br /> <br /> <strong>一个游戏的开?/strong> <br /> 1969q贝实验室的计器U学研究中心QComputing Science Research Center Q?br /> 成员退? MULTICS计划的同Ӟ贝尔实验室本w其实也没有一套完善便利的交谈式计器服务环境。在其中不少工程师们也正Z改善E序设计环境努力着Q? Ken Thompson 、Dennis Ritchie和其同事们在当时草拟一个新的案系l架构,q个档案pȝ也就是早期的 UNIX 操作pȝ的档案系l的前n。当时的 Ken Thompson 忙着使用 Fortran语言原本在 Multicspȝ中开发的game? "Space Travel" Q太I旅游)转移?GECOS System 上开发?当时 GECOS System大型计算机的CPU Time相当昂贵Q一U要 75 块美金)Q同时控?"spaceship"Q宇宙飞船) 的效果不甚理惻I于是 Ken Thompson 不得不寻找替代的开发环境。Thompson看上了一台很被Z用的 Digital Equipment Corporation PDP-7 q你计算机,当时 PDP-7使用的是 Graphic-II 昄器,h不错的图形处理能力?Brian kernighan 于是 Ken Thompson 便与 Dennis Ritchie q手程序设计{Ud PDP-7型计机上?<br /> Ken Thompson在移转工作环境的同时Z得到较好的发展环境,便与Dennis Ritchie共同动手设计一套包?File System、Process Subsystem 及一组 Utility的操作系l,当时q套pȝ仅能支持 2个用者用。由于贝实验室对于 MULTICS计划p|的阴霾还未消散, Brian Kernighanq位仁兄开玩笑地戏U这套新的操作系lؓ UNiplexed Information and Computing SystemQ羃写ؓ UNICSQ之后大家取谐音便叫她ؓ "UNIX" Q没惛_q个开玩笑的名字会被h叫到今天?<br /> <strong>初期的自由发?/strong><br /> 事实上该?"UNIX" pȝ在当时仅是私下的被用,也ƈ没有得到多大的重视,一直到1971q的一个正式的计划QUNIX才正式被搬上台面?br /> PDP-11/201970 q_当时贝尔实验室的专利部门QPatent department Q缺乏一套文书处理系l,Z设计开发的需要,于是C一?PDP-11 计算机。当?PDP-11 计算机的交机q程q不利Q处理器先到Q硬盘则多等了好几个月?br /> ?PDP-11 一切准备妥当后Q他们便?UNIX UL到拥?512K bytes 盘的PDP-11/20 型计机上,q在此系l之下开发了一套文书处理工兗而这套工具便是后?nroff / troff的前w。那时的 UNIX 提供 16K bytesl系l?K bytesl用程序,档案最大的极限?64K bytes. 而此套含有文书处理工LpȝQ也正式获得贝尔实验室的专利部门采用Q系l名Uƈ被编?"First Edition". ?UNIX UL成功? Thompson ?B语言为它d?Fortran CompilerQ但因ؓ B语言属于一U解译语aQinterpretive language Q,执行成效q不是很好,于是 Ritchie又将它—?Compiler 发展成可产生机器码、允许定义数据Ş态及l构QRitchie U它?C语言?973qƈ? C语言改写全部UNIX原始E序QUNIX于是首度出现正式版本——V5Q第五版Q?br /> 此时?UNIX 慢慢地在贝尔实验室内部蔓延开来,装机C变成?25 部之多?br /> ׃当时的贝实验室实际上是掌控在美国电信电话公司(AT&TQ及其子公司西方电器公司的手上,实验室主要是负责研究改进西方电器公司刉的? 国电信电话公司在贝系l中使用的电信设备。同时根据军方合同,从事与国防有关的研究与改q的工作。?AT&T 本n׃有反托拉斯法的限制ƈ不能从事于Q何有兌机斚w的销售,所?AT&T 的主阶层们对于当时 UNIX 的发展ƈ没有太多的支持,因而当时贝实验室内部对于 UNIX 的发展ƈ不是相当在意也无意于之推广。不qؓ了应付实验室内各部门日益增加? UNIX 使用者与相关技术支持需求,q是成立?UNIX ystem Group Q简U? USGQ。但该组l也仅只是提供技术上的支持,q未赋予l箋发展的Q务。所以当时的 UNIX 发展Q全靠AT&T的工E师们的努力。这D|? UNIX 的发展完全没有组l及pȝ性可aQ而玩家尽是一些工E师们,于是乎种下了 UNIX 日后较难以被一般h所接受的命q?br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M10351522035M3.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351522035M3.jpg');" border="0"><br /> <br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M10351522035M3.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351522035M3.jpg');" border="0"><br /> <br /> <strong>走出贝尔实验?/strong><br /> 1974q?Thompson ?Ritchie共同?Communications of the ACM发表了一?UNIX 论文 "UNIX Time-Sharing System" 得到相当大的回响?1975 q?UNIX 发表W六版(V6Q﹐其提供的强大功能更胜q当时昂贵大计算机的操作pȝQ其最大特Ҏ以高U语a写成Q仅需要做部份程序的修改便可ULC同的计算? q_上?UNIX V6版本q有完整的E序原始码在 1976 q正式从贝尔实验室内部传播到各大学及研究机构QUC Berkeley 也就是依据这个版本开始研Iƈ加以发展Qƈ?1977 q发?1 BSDQ?st Berkeley Software DistributionQ版本的 UNIX OSQ其后箋的发展更?UNIX OS贡献良多且媄响深q,此点E后再ؓ你说明?br /> 同年 UNIX 因它提供良好E序发展环境、网l传输服务与及时服务QReal-Time ServicesQ,而广得各电话公司采用。Interactive System Corporation更因 Value Added Reseller QVAR Q运?UNIX 来强化办公室自动化环境,成ؓW一家应用UNIX操作pȝ的公司。此qUNIX亦被修改q第一ơ装? Interdata 8/32 型计机上。这也是 UNIX 操作pȝ首次安装在非 PDP型的计算Z。自?UNIX pȝ开始被UL改装到各型微处理机及新计机?<br /> <strong>一个稳定的基石</strong> <br /> 1978q?UNIX 发表对今日媄响最重大?UNIX W七版(UNIX Time-Sharing SystemQSeventh Edition Q也是 V7.此版本包?Fortran 77 compiler、Shell Q只有Bourne ShellQ、文件处理工Pnroff/troff 、roff?MS mocro{)、UNIX-to-UNIX-file-CopyQ用来支持两?UNIX 机器间的档案传输Q、数据处理工PAWK 、SED {强悍的工具Q、除错工PADB Q、程序发展工PMAKEQ、Lexical analyzer generatorQLEX 、YACC{)、简单的l图工具、ƈ支持 C语言?LINT verifierQ主要执行于 PDP-11 及Interdata 8/32型计机上。在当时那个q代来说其系l的架构与功能已l是相当的完备的了。Bourne Shell的原作者称她ؓ "improvement over all preceding and following Unices" Q在今日也有人称q个版本?"last true Unix".由此可见 V7 ?UNIX 发展里程上的扮演了相当重要的盘石角色?br /> 在当?DEC公司推出了一?32-bit supermini L—?VAXQ搭配的 VAX的操作系l叫?VMS. q款q你U计机的硬件无可挑剔〈直C日她的稳定度仍是被诸多老一辈的pȝ理者所赞许的〉,?DEC? VMS操作pȝ的支持性却让贝实验室的工E师们宁愿用UNIX OS . 而这工作则是由 John Reiser和Tom London所共同完成。他们以 V7 为基转移 UNIX OS?VAX计算Z使用?br /> q个版本被称?UNIX V32.同时Z转移的方便性,他们?32-bit ?VAX当成是大一点的 PDP-11 Q因?DEC ? PDF-11 型计机?16-bit Q,同时Z执行的效率,V32 攑ּ使用 VAXg提供的一?paging 功能QDEC ?VMS OS 有支?paging 功能Q也׃ V32舍弃q项功能Q所?V32没有虚拟内存的功能)?br /> 即是如此,V32 支持的地址已高?4Gb. ph有支持paging功能?V32开始被q泛的安装在 VAX的机器上q作?<br /> DEC 则是?1984 q左x出来自己?UNIX OSQ叫?ULTRIX. <br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M1035156104cD.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M1035156104cD.jpg');" border="0"><br /> <strong>一个重要的延箋及发展—?BSD UNIX</strong><br /> 旉回到 1973 q?11 月, Ken Thompson ?Dennis Ritchie 在印W安UPurdue大学的一场操作系l原理的座谈会。会Z、坐着一位柏克莱大学QU.C. Berkeley Q教授,名字?Bob Fabry. 当天?K&R所发表?UNIX 立刻引发 Bob Fabry的极度兴。当时的柏克p是处在用大型计机L、批ơ执行程序的阶段Qƈ没有?UNIX q样的交谈式作业环境。会后,他便军_UNIX带回柏克莱?br /> 于是柏克q计算器科学、数学与l计三个pL合买的一?PDP-11/45Q准备用来迎接UNIX.1974 q?1月,Bell Labs寄来了一?V4 的磁带,学生 Keith Standiford 便开始进行安?V4 的工作。安装时 Standiford 到了问题,便{?Bell Labs求援。h在新泽西州的 Thompson 侉K过柏克p端速度只有300-baud的调制解调器在在U进行侦错?<br /> ?UNIX 的发展史上,q是 Bell Labs与柏克莱的第一ơ接触?br /> 完成除错后,V4侉K利地在柏克莱q台C?PDP-11/45计算Z工作了?br /> 当时q台是三个系所合买的,计算器科学好不容易装上了 UNIX Q却到数学与统计系所要?DEC's RSTS systemQ所以在一阵协调后QUNIX?DEC's RSTS system? 8Q?6时的比例分配,供三个系所轮流使用。一D|日后Q具交谈式功能的 UNIX 在效能上的表现得到绝多数学生们喜爱,UL自q计划转向UNIX的时Dc而一天占?16 个小时的批处理时D却乏h问|?br /> 当时 Eugene Wong?Michael Stonebraker教授Q看上了 UNIX 提供的便利性,便打将他们?INGRES 数据库计划重原先批处理的计算机环境{UdUNIXpȝ上面。在 1974 q_他们执行计划添购了一台新?PDP-11/40 计算机,上面安装?V5.q个计划也就是柏克莱的第一个将作业环境转移到UNIX的案子?br /> UNIX作业环境的需求,在柏克莱q速地成长。ؓ了应付需求,Michael Stonebraker 与Bob Fabry 教授军_再申误C? PDP-11/45. 1975q初QDEC 推出 PDP-11/70Qh格差不多{于两台 PDP-11/45Q但功能 PDP-11/45 所以他们便军_改购C?PDP-11/70. <br /> q台机器引来?Ken Thompson 、碰?Bill Joy 以及日后产生?1BSD.她就宛如是一?UNIX 史上的地标,沿袭?Bell LabsQ竖立在柏克莱,承先启后q开创新局。农夫个为,她应该被供在博物馆?br /> 当这台机器在 1975 q终q达柏克莱时Q同一旉QThompson受邀回母校(柏克莱)当客座教授,U目是 NIX.Thompson 在校期间?Jeff Schriebman?Bob Kridle 一起动手将新版?V6 安装?PDP-11/70.<br /> Bill Joy1975q_一位密执安州大学的毕业生来C柏克莱,他的名字是Bill Joy. 当时 Joy和同?Chuck Haley Qtar 是他写的)喜欢一h在计机戉K面,Thompson也时常插上一脚。他们成功地改善?Pascal 的解译与侦错的能力,同时q提升了解译与执行的速度。另外换装上 ADM-3的屏q后Q他们觉得ed文字~辑指oq不合用Q于是根据另外一个相似的 em 指oQ发展了自己的觉得满意的文字~辑工具Q也是指o ex.<br /> 1976q夏天,Thompsonl束了他的休假回?Bell Labs. 此时?Joy和Haley 已经开始着手探?UNIX kernalQ甚臌做了一些修攏V?977q初QJoy 制作了一L带,上头写着"Berkeley Software Distribution." Q这是 1BSD. 其中包含新的 Pascal compiler?ex ~辑器?<br /> ơ年Q来了几台新屏幕—?ADM-3a Q这U屏q支持光标地址昄QJoy 在这U屏q上完成了有人爱不释手;有h恨之入骨的文字编辑器—? vi.接着不久QJoy 便发C个问题,老旧的屏q装备,q是会被用在其它的计机上。ؓ了支持上的方便,Joy 针对此现象设计了一个接口,用来理、支持不同的屏幕装备?br /> q个接口是现在?termcap.1978 q中Q包含了功能加强?Pascal ?vi 及termcap ?"Second Berkeley Software Distribution Q? 也就?2BSD Q迅速的取代了原先版本?br /> 1979q_臛_?75 ?PDP-11 的机器上安装 2BSD 在运作着。自此在 DEC PDP-11 pd上执行的 BSD版本便一直以 2.xBSD 作ؓ识别?br /> ׃ PDP-11 计算机实在相当长寿,持箋C日农夫我仍然在网l上发现q关于PDP 计算机的|站。似乎到今日它们仍旧在某些地斚w默地工作着?br /> 2.xBSD最q的一ơ改版是?1987 q_使用 4.3 BSDZ架构改写Q版本定?2.10 BSD.<br /> ?BSD UNIX 中登场的重要功能当中Q有一个直C日仍然叫人又爱又恨的指o– vi.我接触过不少学习 UNIX OS的hQ大部分的h? vi 的用与掌握都不顺手,其中恨死q个指o的也大有人在Q前些日子农夫我q看到某个网站公开讨论?vi 是否ȝ?UNIX 的发展?实在夸张了一点!<br /> Bill Joy多次公开地说Q他要是知道 vi 会如此受" Ƣ迎" 的话Q他宁愿当初没有?vi q只E序。不q?Bill Joy 也说q,当时他原本还惛_入一?Multiple Windows in vi 的功能,不过当他在写q部分程序的时候,带机坏了,所以Bill只好在没有备份的情况下l工作,想不? 屋漏偏逢连夜雨" Q程序写C半,他用的盘也跟着挂了。在无可挽救又没有备份磁带的情况下,Bill宣告攑ּ?vi 增加 Multiple Windows q项功能。事?Bill 为前一版的 vi 写好使用说明后就l箋作其它的事。所?vi 长成今天那付d性。农夫我认ؓq或许是不是祸Q搞不好当初要是q?Multiple Windows q项功能一起发表的话,上头的图可能是遗照了?br /> 当时有位 Richard Fateman教授Q原先用一?PDP-10 上进行着他的Macsyma 研究计划。但他需要更大的内存地址来执行程序,所以在 1978 q初Q他看上了当时_吉多新发表的 VAX-11/780.好不ҎQ他联合了其它的部门才凑?VAX的经贏V刚开始时Q机器原本安装的?VMS操作pȝ。不q别的成员要执行 UNIX 操作pȝQ于?Fateman安装上了 V32. 但问题来了,V32 q不支持虚拟内存QFateman 便找上了 Domenico Ferrari 教授Q希望他与他的研I小l能?UNIX 加上q项功能。当时一位学生叫 Ozalp Babaoglu Q他惛_了一些解决的Ҏg可行Q但因ؓ牉|?VAXg?UNIX kernal的问题,于是他找上了 Joy帮忙?br /> 在只有一?VAX的状况下Q他们努力奋战着?979q?1月,?VAX上支持虚拟内存的UNIX版本l于诞生QV32 从此走入历史。紧接着 Peter Kessler?Marshall Kirk McKusick Z加上了PascalQJoy 则动手将 2BSD 上的 ex、vi、C shell {工兯{UMq来。这个版本就?3BSD.一个首ơ支持虚拟内存、demand paging ?page eplacement ?UNIX OS.<br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M1035161F53004.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M1035161F53004.jpg');" border="0"><br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M1035164Z63303.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M1035164Z63303.jpg');" border="0"><br /> <strong>UNIX?DARPA交会</strong><br /> 1970q代末,国国防部先q研I计划机构(Defense Advanced Research Projects Agency ——简U? DARPAQ正在ؓ AI QArtificial Intelligence Q,VLSI及计器视觉{研IӞvision research Q找M个可共通作业的计算机环境。硬件方面的首选是q吉多的 VAXL。配合的操作pȝ?VMS. q样的组合因拥有相当接近 DARPA 需求的功能被列入优先的考量Q但?DARPA?DEC商谈对于 VMS的支持事宜之后,DARPA q没有得到满意的{案。这q他们考虑朝向UNIX发展。但当时 UNIX OSQ指的就?2V Q搭? VAXQ最大的~憾是没有支持虚拟内存Q但此时已经有h克服了?br /> 当时QBob Fabry 教授写了一份徏议书l?DARPAQ徏议他们以柏克莱支持虚拟内存的 3BSD 为基Q发展成划所需。这份企划书引v?DARPA的高度兴。随?3BSD 也实际获得了 DARPA相关计划成员们的良好风评Q也因此最后柏克莱大学打|了卡奈基梅隆大学?BBNQBolt Baranek & Newman Q? Inc. Q,?Bob Fabry成功地获得了 DARPA的资助合U。这份合U开始于 1980 q?4月,为期 18 月。此后的 DARPA便以 UNIX OS为标准操作系l?Bob Fabry 教授在取?DARPA合约后,依约成立了一个支持机构,也就? Computer Systems Research GroupU?CSRG.Bob Fabry找上?Bill Joy 来负责Y件开发。Joy q速地以先前的 3BSD 为基Q整合新的功能。如 Job Contro l Q作者是 Jim Kulp Q、auto reboot ?K block file system. 同时也整合入Pascal compiler 、Franz Lisp system、enhanced mail handling system.q就是在 1980 q所发表?4BSD.没多久她便被安装在将q? 500台VAX 上?<br /> DARPA 采用了这个版本作为当?DARPA的标?UNIX 操作pȝ?br /> 树大招风Q当Ӟ有位?Stanford Research Institute的仁兄叫 David KashtanQ写了一份关?VMS? BSD UNIX?VAX上的执行效率评估。该份报告指?BSD UNIX 在效率上不如 VMS来的好。Joy 知道qg事之后,׃不到一个星期的旉Q重新调?UNIX kernal. 然后也写了一份报告,证明他们的BSD ?VAX上要? VMS优越多多?1981q?6月,q个 Joy调整q的pȝQ加上了 Robert Elz 写的 auto configuration Q以 4.1BSD 的版本发表了?<br /> 当时?DARPAҎ克莱 4.1BSD 的表现相当满意,于是l签了两q的新约Q金额更是先前合U的 5倍。其中有一半的金额用在资助柏克ql发?BSD UNIX . 钱多的相对代价就是要求高。当ӞDARPA ?UNIX 的期望开Z明确的目标;更迅速、更有效率的档案pȝ、支持程序可执行地址?multi-gigabyte 、提供弹性的解译沟通能力、具整合支持|络能力?br /> 在此同时Qؓ了达到计划的目标QDARPA 成立的一个指导委员会Q主要的成员有柏克莱?Bob FabryQ?Bill Joy QSam Leffler 、BBN 公司?Alan Nemeth and Rob Gurwitz、贝实验室?Dennis Ritchie 、史丹佛大学?Keith Lantz、卡内基。梅伦大?Rick Rashid、麻省理工学?Bert Halstead、信息科学协? Dan Lynch、DARPA ?Duane Adams and Bob Baker以及加州。洛杉矶大学?Jerry Popek.<br /> 不久QJoy 便开始整合早?BBN?Rob Gurwitz所发表?TCP/IP protocols Q不q他?BBNq些E序的执行效率ƈ不满意,于是 Joy?Sam Leffler重新写的一版自qE序?br /> 另外Qƈ加入了一些支持网l的工具 rcpQrsh Q?rlogin Qrwho. 他们U她? 4.1aBSDQ这个版本ƈ没有正式发表Q在1982q?4月开始供内部使用。虽是如此,?4.2BSD 未正式发表之前,她还是繁D的到处都是? 月, 4.1aBSD kernal加上了新完成的案系l,版本更新?4.1bBSD.<br /> rcp Q?rshQ?rlogin Q?rwho q群指o。因安全机制上的理由Q逐渐被另一新的指令群所取代Q新的指令群?SSHQSecure ShellQ。SHH 相关|址Q?a target="_blank">http://www.ssh.org</a>Q?br /> 1982q的春季末,已厌倦了在柏克莱环境?Bill Joy Q答应受邀加入当年刚创办的 Sun Microsystems Q?Inc. Q成?SUN的第四号创办人。那q的整个夏季他就在两地奔走。之后他对修改中的弹性解译沟通机制及改写 UNIX kernalC个段落之后,? Leffler接手了他的工作。由于合U期限的因素QLeffler ?983q?4月发表了 4.1cBSDQ提供给参予 DARPA各项相关计划的成员试用? 月,DARPA 的指导委员会W二ơ会议招开Q验收与讨最新版?BSD 成果。l整?UNIX pȝ? LefflerQ在 1983 q?8月,发表?4.2BSD.她达CDARPA 的预定的需求;以应付 CAD/CAM影像处理?AI 研究的高速的档案pȝ及扩展强化的虚拟内存功能Q提供能分散处理的解译沟通机Ӟ支持56-Kbit ?ARPA Internet|络q结Q以? 10-Mbit/s Ethernet 的局域网l;q有l过重组架构已模块化?kernal code Q提供更有效率的计算机^台移植?br /> SUN 以生?RISC 架构的工作站计算Zؓ主,使用的正是以 BSD为基所的UNIX OS.在当时以不逊色于大型计机的多人多d、具|络沟通功能的UNIX OS 、加上hg廉的gQ相对于 mini U计机而言Q,q获得工E界的青睐,而miniU大计算机的命运自此注定开始逐渐式微。计机软g的应用因为有了网l于是也开始朝? Client-Server的架构发展?br /> 1982q_SUN 有了自己的操作系l—?SunOS 1.0——承袭自 4.1BSD.一直到 1990 q?1月,发表 SunOS 4.1.1 版同时冠?Solaris 1.0ӞSUN 才算开始向 System V 版本靠拢?br /> SunOS 4.1.1 可算是以 BSDZ体再附加?System V 工具?UNIX 淯ѝ但q其实是个商业考量的过渡性做法(后文会加以说明)?<br /> ?SunOS 4.1.x版的字眼也仅延箋?1994 q的 SunOS 4.1.4为止Q她后的版本是 Solaris 1.3. 真正延箋C日的 Solaris版本Q则是始?1992 q?7月的Solaris 2.0 QSUN OS 5.0Q?br /> 在商业有所成就?SUN Microsystems ?UNIX OS的发展倒也做了些重大A献;?1984 q发表的 NFSQNetwork File System Q与其后?1986 q发表的PC- NFS. <br /> <strong>商业化的不^坦历E—?UNIX 版本的战?/strong><br /> UNIX商业化实质上x味着生各U独立化?UNIX 版本Q这点大概是最显而易见的事实。如果以商品要具备独Ҏ与独占性的利益来做考量的话Q其实一点也不意外。因?UNIX 开始衍生的相当多的版本。这U现象,对用者以开发应用程序的厂商而言Q已l造成了某成程度上困惑。然而,一U无所适从的无力感其实才刚开始?<br /> 1984q?1?1日, AT&T q个拥有 1495 亿美元资产? Q?09 Q?00 位员工的庞大巨兽Q终于被格林法官QHarold H. GreeneQ以反扥拉斯法(antitrust Q?强制拆解成七? RBOCsQRegional Bell Operating Companies Q?. AT&T 也因而在一夕间解体成ؓ区域性网l公司,从此失去了长途电话的垄断性地位。这U时I的转变?AT&T ?UNIX 的态度有了 180度的转变Q其实,农夫我指的是收费的态度Q?br /> 先前已经提过 70 q代初期?AT&T Q已l在镉K电话市Z占有l对垄断的优势,因而被国政府的限制不得涉与从事计算Z其它行业Q也正因而造就了UNIX发展初期的自由开放。直? 1979 q_AT&T才宣布要?UNIX 商业化的计划?981q?11 月,AT&T属下的USG 发表?System III.ơ年又更CؓSystem IV.E后?1983 q_AT&T ?CRGQ?USG合ƈ成立?UNIX System Development Lab. 一般简UCؓ USLQ从其名U就不难清楚她将要扮演的角色。该q?System V 上市了。此? AT&T 发觉每次版本更新都得׃宣传费Q实在不划算Q所以决定在 System V 以后Q名字就不再做变动了?984q_System V Release 2发表Q简UCؓ SVR2.在这个版本中Q才l于看到来自 BSD 版本? Virtual memory 功能Q农夫我不得不惊?AT&T 的稳健作风。SVR3则是C 1986 q才发表Q随?1987 q又发表?SVR3.2.<br /> 1987q_在工作站市场上已占有一席之地的 SUNQ找上了 AT&T Q打将System V?BSDq两大版本归Zl? 1988q初Q双Ҏ{订了合作合U,AT&T取得 SUN的一席董事,同时亦有权买? SUN癑ֈ之二十的股䆾。这合作计划,原本有机会整合当时版本纷q UNIX OS. 但那是理惟뀂实际上q个计划反而让 UNIX 族群里的其它成员恐慌万分Q特别是 IBM、DEC 、HPq几个业龙头。ؓ了抵制这行动,他们l织了一个反对联盟。因此「开放Y件基金会」也是 Open Software Foundation U?OSF?1988 q正式诞生;成员除了前面的三巨头外,有多达三十几家计算机硬件制造厂商与pȝ咨询N公司Q也相以行动投入到此反对的行列中。然? AT&T ?SUN也不C弱地组l了 UNIX International Q也是UNIX国际公司Q成员数量虽然不? OSF阵营来的多,但如果她?Intel?Toshiba 、Unisys、Motorola、Fujitsu Q这几个大块_那也是很够看头的?br /> 企业自n的利益在现实世界里始l是以个体的考量Z先,所以这两大阵营始终没能再达成Q何共识,p当时所制定?UNIX l一标准规格Q严格来说也从不曾被实现q。这U企业利益上的冲H与矛盾其实也存在于同一个阵营中不同的成员之间。两大阵营对峙,可以说是 UNIX 有史以来最重大的业冲H事件?br /> ׃商业利益的政治考量大过技术问题的考量Q也因此奠定?UNIX l分裂下ȝ命运?AT&T ?1989 q发表了 SVR4 QSUN 在日后也她?SunOS 4.1. 1 开始冠?Solaris的字|以行动靠?SVR4.OSF 则是?1990 q发表了OSF/1.UNIX版本的问题因而更加؜׃。但有趣且可W的是,开攄l——Open System Q这个双斚w标榜的理念与观念却因此在计算Z业界引v了回响,q点倒是原先所始料未及的?br /> 不久 AT&T 撤销了对 SUN的投资,同一个阵营的成员彼此也因而劳燕分飞?br /> USL ?1991 q正式{变了一家独立的商业公司。但 UNIX 在商业市Z的h值却出现了变?#8230;…<br /> <strong>?UNIX 自由—?Networking Release 2</strong><br /> 自从 UNIX 走出贝尔实验室后Q研I机构与学术界就扮演了承与发展的双重角艌Ӏ在1979?1984 q这D|_UNIX的拥有? AT&T Q对于学术界的授权政{尚可用「大斏V来形容Q同时也对学术界做某U程度的资助与合作。当时的学术界,得助?AT&T 的大Ҏ权与分nE序原始码,研习 UNIX q个分时操作pȝ开始在学术界蔚Z股风气,甚至可以说是一U潮或一U流行。其中,像柏克莱 BSD? UNIX 的A献,是一个公开的事实。但早期?BSD使用者,是必需?AT&T 支付授权金的。这点,从业界资助学术界的角度来看是一点也不值得惊讶的。因金的援助Z是取得其成果。所以当时基?AT&T 原始码所发展的成果,均归?AT&T 所有。也因?AT&T 掌控?UNIX 的所有权。到?984q以后,AT&T开始更U极C?UNIX 的原始码QAT&T甚至q要求各大学的用h员签订保密条U,惌此防?UNIX 的原始码从学术单位流出,以媄响到商业利益?br /> ?DARPA资助柏克׃?BSD OS 发展的过E中Q诞生了 TCP/IP q项q泛影响C计算Z因特|的通讯协议。由? DARPA对于资助开发的软g目有明文规定接受资助者必L条g地释出程序的原始码,所?TCP/IP 的原始码与程序的版权q不属于 AT&T 所有。这点在C看来其意义是不凡的。也正因为有此一条gQ柏克莱?CSRG QComputer System Research GroupQ因?BSD Vendors需求,?1989 q?6月发表了 Networking Release 1 Q她包含了TCP/IP source code以及一些工P提供l当时正开始v步发展的个h计算机制造业者用。Networking Release 1 授权收费?1000 元Q而且不需?T&T的商业授权,取而代之的是柏克莱大学的开攑ּ授权?br /> 农夫我看柏克莱授权方式,几乎可以说是一U良心式授权方式Q在实质的运用上她完全没有限制。她允许原始码或执行在M情况下修改ƈ且允许将修改后的E序 从事商业行ؓ而无MQ何回馈,当然也没有绝对要求开发者必要释出原始码。如果你攚w不改地加以贩售,她也没有意见。但有一点不可违反的限制Q就是必d 衍生物的版权声明上提到柏克莱的A献。这U做法在日后Q也没有多少改变Q而这L授权方式也成Z柏克q授权_?<br /> Keith Bostic׃ Networking Release 1 所得到的响应实在远过 CSRG 成员的预估?br /> q个不算差的成果Q让柏克q CSRG 觉得有必要释出更多属?BSD的程序原始码。于是激?CSRG 的成?Keith Bostic开始组l志愿工作者从事一就不能够惊天也以动地的E序写作计划。计划的主要目的在当时还真让人感到有? 乌扥?.农夫我个人喜Ƣ戏U她为「解?UNIX 计划」?br /> Marshall Kirk McKusickq项计划大体上分成两个部分,操作pȝ工具QUtility Q?br /> 与核心(kernalQ。而且参与人员必须在完全没有参?AT&T UNIX source code的情况下q行撰写E序的工作。因为只有在q种条g下,写出来的E序代码Q才能摆?AT&T 的着作权束缚。当然这也绝对不是一件容易的事。Keith Bostic四处奔走Q组l了过四百名热心的软g工程师,l过了长辑֍八个月的奋战之后Q操作系l主要的工具与链接库才算改写完成。Marshall Kirk McKusick负责改写当时的核心程序。但pȝ核心的部分,׃长期以来柏克׃ AT&T 一直就彼此分n UNIX 原始码,所以各自所加上ȝE序代码早已h隑ֈ了。ؓ了彻底的厘清双方各自撰写的部分,他们下决心进行逐行比对。首先花了好几个月的旉Q将核心E序? 一行每一个案都建立转换比对的数据库。然后接着q行U除来自 AT&T 32V 的程序代码ƈ改写她们。即使是如此Q仍旧有 6只程序让他们束手无策Q因而无法将核心E序d完整地改写。最后,他们q是军_他们所做的所有成果发表。授权的方式沿用 Networking Release 1 的授权方式,授权的磁带依旧是 1000 金。这个版本就?Networking Release 2 Q也有hU她? 4.3BSD NET/2.发表的时间在 1991 q?6月。虽然这是个不完整的操作pȝ?br /> 但,在今日看来,却有着划时代的意义—?UNIX OS自由了?br /> <strong>谁是" 老大? ——R权诉?/strong><br /> AT&T?USL?1991 q正式{变了一家公司。当Ӟq意味着她将更重视UNIX在商业上的利益。当时的 UNIX OS早以U霸高阶的计机市场Q从 Cray 计算机、IBM 的大型计机L、迷你计算机到工作站,均是 UNIX 的天下(q一点,直到现在21世纪Q仍旧没有多大的改变Q。即使在 80 q代中期后开始迅速发展的个h计算机,虽然当时被戏UCؓ是玩兯机Q但也仍旧有像XENIX[?]Q?Interactive UNIX[?]{几U向 AT&T ~过E的商业化版本?<br /> UNIX直就?AT&T 的一|钱树?br /> 但这一切在 Networking Release 2 Q以后简写ؓ Net/2Q出C后,起了变化Q?br /> 首先Q一?i386 处理器的玩家名叫 Bill JolitzQ在拿到 Net/2之后Q很快地将 Net/2 kernal ~少的程序补齐了。BSD kernalq时可算是大功告成了?br /> 当时 Bill Jolitz他们放在因特网与其它h׃n他的原始码,q且得到了不正面的响应。由于这个版本是使用?i386 微处理器的个机上,所以就命名?86BSDQ在 1992 q?2月正式发表。这该算?BSD首度功能完整且版权独立的版本。Bill Jolitz 是当时唯一?kernal l护者。在他离开q个计划之后QL BSD玩家们gl了q个版本Q日后衍生了 FreeBSDQ然后又从其中分支出裂NetBSD版本?br /> 另一个将 Net/2完整化的是一家叫 Berkeley Software Design QIncorporated的公司,U? BSDI[?]. ׃ Net/2的版权声明中Q宣U其源文件的合法性,q且允许使用者,从事衍生物的商业行ؓQ所?BSDI 他们修改后的系l命名ؓ BSD/386. 他们q将成果打包Q刊d告以 995金的售仯? BSD/386Q而且含原始码Q而且q提供免Ҏ务电话的咨询Q电号号码是"1-800-ITS-Unix". 旉大约是在 1992 q? 1月。当ӞUSL ?System V ?source code的h格大U是 BSD/386h的一癑ր左叟뀂这可惊动了老大? AT&T.q且正式C面严重警?BSDI q反的注册商标法Q电话号码里有Unix的字|Qƈ公开宣称 AT&T 拥有 UNIX 的注册商标。BSDI再次刊登q告公开反击 AT&T Q声明她的商业行为完全合法。果不期ӞBSDI的博命演双方手牵手走上法庭?br /> AT&T?USL控告 BSDI 剽窃他的 UNIX 原始码,要求法官q他公道。在听证会上QBSDI出早已准备好的法宝Q自己在无Q? AT&T source code 的条件下写出的合法档案,以及来自?BSD授权?Net/2 source code. 前面的证据以让 BSDI 立于不|之地Q后者让 BSDI |n在暴风圈外。BSDI的L证获得了法官的采信。但 At&T 岂会此|手Q他们将焦点转移?Net/2?BSD授权上面Qƈ且重新提出控诉,被告的对象变成了 BSDI 与柏克莱大学Q同? AT&T q申h庭禁?BSDI 一切的 BSD/386销售行为。就q样Q柏克莱大学也对号入座了?br /> 农夫我认为,毕竟 AT&T 是营利企业,她得l护她的商业利益Q这Ҏ天经C的事?br /> 虽然柏克莱大学与 AT&T ?UNIX 发展上有着非比d的关p,但商业利益是现实的。企业资助学术界的研I计划,多半是基于商业上的考量Q我怿Q学术界的少数高层在L奥援时不会不明白q? 一点,即ɘq有可能让大部分的学术h士无法接受或不愿接受。不如何,q一记醒倒再ơ挑起了q一点事实?br /> 成ؓ被告的柏克莱大学Q只好无奈地面对q场无情的商业诉讹{但他们也同样不甘示弱地?AT&T ?Systerm V 着作权提出质疑Q因为在 AT&T ?UNIX 授权声明中完全没有提及柏克莱的A献。所以柏克莱反控 AT&T q反 BSD 的授权条ƾ。柏克莱的反击让战况演烈Q诉讼案一路从 AT&T 的老家新泽西州的联邦法庭打到柏克莱大学的所在地加州法院Q但依旧没有l果?br /> C 1993 q_官司q在q行中,?AT&T 却已l打?USL准备以一亿美元的h扑֯C了。最?AT&T ?USL 以八千万元代h的卖l了 Novell.而新C也当仁不让地加入了这场؜战。但却也因此Q战况露Z一U^息的曙光?<br /> 诉讼案在 1994 q?1月宣告终l,以庭外和解收场。实际的协议内容仅有当事人知情?br /> 如果从胜负的角度来看q场诉讼Q或许柏克莱?BSDI 是胜利的一斏V但如果从UNIX发展的脚步来看这|可能根本没有Q何一Ҏ胜利者了?br /> 事gqx后的 1994 q?6月,柏克q CSRG 风光地发表了 BSD 4.4 Lite.在这个版本中Q有 70 个案引用的一份新修改的版权声明,阐述?AT&T ? BSD双方的A献,q明地l予案自由散播的权利。但不知ZQ应该有能力完整发表?BSD 4.4 Lite q是~少了三的案。当Ӟ农夫我也很高兴地C一本BSD4.4-Lite CD-ROM Companion Q含一张光盘,现在拿在手上Q看来总觉得有点呆?br /> 掌握 UNIX source code 以及 UNIX 商标?Novell Q将 UNIX 商标交给X/open理Q自己则发展了一套命名ؓ UNIXWave 的操作系l。推出后市场的反应ƈ不热l。不久,Novell?SCO接头Q在 SCO保证l箋支持UNIXWare 的条件下QUNIX?1995 q二ơ易主,C人是SCO[?].<br /> 备注Q?1 Intel?1978 q发?4.77 MHz ?8086 微处理器?980q_Microsfot 便以 V7 为基Q发表了在微处理器(microprocessor-based computersQ上执行的版本也是 XENIX. C 1982 q_一家成立于 1979 q的软g公司 Santa Cruz Operation Q成为微软的合作开发厂商。之后她q家公司便一直致力于q个领域里gl到今日Q羃写就是今日的 SCO.<br /> *2 Interactive IS/1 Q以 V6 Z体)。这个版本后来演化ؓ比较让h熟知的名字—?Interactive UNIX. 后来因ؓ Sun Microsystems 致力发展 Solaris for X86Q被财力雄厚?Sun Microsystems 合ƈ了,如今已经不见t迹了?<br /> *3在我反复修改这D|E的时候,BSDIq家公司已经?Wind River 合ƈ了,改名为iXsystems.2001/05/03 <br /> *4 2001 q?5?4日,Caldera International Q?Inc. 正式q购?SCO的服务器软g部及SCO 专业服务部这两个部门Q新的控股公司名?CalderaQ?Inc<br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M10351DZN248.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351DZN248.jpg');" border="0"><br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M10351HPY959.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351HPY959.jpg');" border="0"><br /> <strong>GNU 计划——开启了新大?/strong><br /> ?1983 q?9?27 日,ȝ理工学院人工实验室(MIT Artificial Intelligence Lab Q的 Richard M. StallmanQ以下简UCؓ RMSQ,在net.unix-wizards以及net.usoft ? newsgroups 贴上了一份标题ؓ "new UNIX implementation" 的讯息。这是如今qؓ人知? GNU计划的开始。在那则被视为「GNU 宣言」草E的讯息中,RMS 阐述个h的理念与计划的目的——完成一个命名ؓ GNU?"Free UNIX"操作pȝQ希望藉此寻唤理忉|同者共襄盛举?br /> 「如果我喜欢一个程序的话,那我应该分享给其它喜欢q个E序的h」,q是RMS 的右铭。此点也g正是促其决心运?GNU计划的原动力。当时的RMS 是想写出一套免费的操作pȝ。能够让每个人如I气般地自由的取得与使用?<br /> 选择“UNIX兼容”计的主要原因是;RMS 表明QUNIXq他个人理想中的操作系l;他仅阅读一些相x据,但未曾用过QMIT 使用操作pȝ?ITS——Incompatible Timesharing System"Q;但他认ؓ UNIX 操作pȝh优良的本质特性。他怿如果 GUN?UNIX 兼容更Ҏ令h接受。所?RMS承袭 MIT用递归~写字命名的传统? GNU释译界定 Gnu is Not Unix.<br /> 1984q?1月,RMS Z展开他的理想而决心离开已经待了十几q的 MIT AI Lab.。当他向他老板 Patrick Winston 辞职ӞWinston 试图挽留地说Q「你q是要辞职?」。RMS 不ؓ所动的回答Q「是」。Winston 昄得到预料中的{案Q于是接着说出了思A里关怀Q「你惌保留你的钥匙吗?」。于?RMS׃此开始专心地" ׃" 在他的老东家。一个hH在他原来的旧办公室中,规划着如何开始他?GNU计划。但惛_发一套新?UNIX 兼容的操作系l,即是胦力、h力资源雄厚的计算机公司,也绝对不是一件说惛_p够做到的事?<br /> 当拟妥他的「GNU 宣言」之后,他正式向全世界呼唤、表明其所为。种子落C?br /> GNU 计划的第一只程序要是孤军奋战?RMS?1984 q?9月开始撰写的Emacs ~辑器?br /> 1985q初QEmacs 已进入可用的阶段。于?RMS她攑֜pre.ai.mit.eduq台机器?FTP server 上,免费地让 amonymous的到访者自׃载用。不久后QEmacs 强扞的功能引发了一些玩家们的注意,׃附上?source codeQ玩家们能自己动手ؓ它添加新的功能或除错Q很快地QEmacs 获得了相当热烈的回响。随着名声渐播Q开始有人相l地加入 GNU计划的程序写作阵营? 此道不孤" ?RMS倍感振奋与喜悦?br /> 当时的因特网q未十分普及。所以有不少然对 EmacsE序有兴,却没办法l由 FTP的管道取得,因而有人透过其它道?RMS询问能如何取得时Q这可让当时处在׃状态的RMS 看到能够支持他l奋战下ȝ资金来源——贩? 自由软g".<br /> 一个h、一个独立的个hQ要惛_现实中实行自q理念Q最先得接受" 现实".唯有接收它是事实Q实行理늚道\Q才获得比较E_的v点与开始。 ——网l农夫如是说?br /> 想着、写着Q脑中突然掠q一丝感受(所以顺便记录在q个地方Q。不如何,RMS 真的开始以一L?150 块美金的代hQ服务有需要的人。也因ؓZq个开始与基础QRMS 当年便创立了自由软g基金会—?Free Software FoundationQ以后简UCؓFSF Q。这对GNU 计划而言Q意味着它已跨越个h化理늚构思阶D,q进入了有群体组l化的运作阶Dc?br /> 同时QRMS 也制定出了属于GNU 计划的Y件版权。RMS 使用 "copyleft" 用来形容她,其实是与着作版权(copyright Q?" 对立" 之意。这也就?GPL—?General Purpose LicenseQ通用公共授权Q?br /> GNU 计划的种子,pL根发芽了?br /> 从贩? GNU自由软g扩展到其它的相关软g与参考手册,提供软g技术支持,q接受计机器材与资金的捐助Q捐助者依法n有一定额度的减税Q,Z业代训Y件h 才。FSF 努力地开辟胦源却仍旧是运作资金捉襟见肘。RMS 本hq不支薪。而FSF 聘请软g工程师的待遇Q也仅是软g业界薪资水^的一半。但q绝不表CGNU 计划的Y件水准是半桶水。GCC ~译器是 GNU计划?1987 q? 3月开始发表的免费~译器,当时的版本是 0.9试版。如今最新的版本则是 3.0. q个~译器可以说是今日自pY件写作的基石。GCC 所解译的机器码Q其可靠度绝对不逊于商业化的~译器品,甚至可以说是优越q商业编译器?br /> 90q代初,GNU 计划暨已完成了质量与数量均十分可观的pȝ工具。这些工兯q泛的用在当时各种工作站的 UNIX pȝ上。虽然已有如此的成果Q但仍称不上是完整的操作pȝ。他们缺一支属于自q" 核心E序QkernalQ?.<br /> UNIX?4.2BSD 之后Q越写越?kernal 开始带来一些不便与问题。因而当时便开始有另一个写作理念逐渐在发展——微核心Qmicrokernal Q理c?br /> 1985q_卡内基大学(Carnegie Mellon UniversityU?CMUQ暨?4.3BSD 为发展基Q将之一拆ؓ二,分成 micro kernal ?single server两个部分?<br /> 该计划的名称?Mach". q个计划成了微核心发展的技术先沟뀂GNU 原本有意直接采用"Mach"计划的成果。但无奈Q这一{,?0q代中等C90q代初,在几l商量之后,他们打算采用微核心的写法Q成立自q计划Q? 名称?Hurd". q项计划Q如今仍在奋战中Q虽?microkernal的做法让他们吃了不少苦头Q但可喜的是Q?.2 Q?0.3 试版本已经发表?br /> 直到 21 世纪的今日,RMS 依旧努力不懈地耕耘着他的梦土。尽他本h认ؓq尚未完全地实现他的「GNU 宣言」;但他执着于理늚行动Q已凝聚了相当数量的自由软g写作族群们,在这些h与群体的努力下,一条新的大道其实已l被开拓出来了Q她通往一个新的世 界。大道旁Q枝叶已然繁茂的树荫下,可口果实一如礼物般Cؓ所有的人成熟。h们称她—?Linux.<br /> <strong>C代的焦点—?Linux</strong><br /> 1990q代中期Q因特网因出?World Wide Web Q?HTML q种新型态的应用Q而开始迅速的延烧全世界。一夕间Q架讑֛特网L的需求激增。这时有一套可以免费取得,q且能让 x86计算机升格成 UNIX U主机的免费操作pȝQ开始了吸引全世界目光。在传媒与计机工程师们的竞相走告下成ؓ了这个新世代的焦点,q个新的名字是 Linux. <br /> Linus Benedict Torvalds 当然Q这套媒体吹捧的当红炸子鸡,可非一Z功,一夕即成的。Linux 是一套版权彻d底与 AT&T 无关?UNIX-like OS.原始核心E序的创作者是芬兰c的 Linus Benedict TorvaldsQ现今他仍旧是核心程序的l护者)。操作系l里大部分的pȝ工具Q来自于 RMS行之多年? GNU计划成果Q以及其它的自由软g写作计划产生的YӞ?X Windows、KDE 、Gnome {窗口接口。由于构成操作系l的主要部分均奉?GPL 版权Q所以市面上有相当多L安装套gQ目前较qؓ人知的有 RedHat 、Slackware 、SuSE、Debian GNU/Linux ……。也因此Q这套操作系l,可说是包含了无数字自pY件写作者的共同心血?br /> 如此的一套操作系l其实也是 RMS多年来想要达成的宿愿—?"Free UNIX". 所以,RMS 本h总认名U改?GNU/Linux".因此Q也有h?GNU/Linux来称D个操作系l?br /> Torvalds打从十岁出头当他外公? 键盘? 开始,C中学已成了不折不扣的计机q?990q_当他p赫尔辛基大学QUniversity of HelsinkiQ? 信息pMqQ选修一门「C 语言?UNIX 操作pȝ」的评Q因而疯狂地qh上了UNIX操作pȝ。那q正好赫辛基大学正好添购的一? VAXQ安?Ultrix 操作pȝ。连接了 16 台终端机供授译ָ生用。有所限制的计机资源Q对一位计机qh说是极痛苦忍受的?br /> Torvalds开始作梦想" ? 一套可以在自己计算Z跑的 UNIX.<br /> 1991q?1月,Torvalds利用 "学生h" 加上d?"耶诞U包" Q以分期付款方式C一?386 DX33 个h计算机(他的W三台计机Q。他选择安装的操作系l则是在学术界颇负盛名的 Minix[ ?]. 在几番奋战下Q就l运作的 Minix OS 功能性却多方面无法满Torvalds的需求,因而激发了他重头来的欲c于?Torvalds 在他?386 DX33 上逐步探烦q撰写出他自q核心E序。他|络上释攄W一个版本是 1991 q?9?17 日的 0.01 版。虽然她是个陋的开始,但由? Torvalds 本h持箋l护与网友回馈A献,原本一个h所撰写的核心程序竟在不知不觉中逐渐转化?"虚拟团队" 的运作模式?br /> 然而,一般计机使用者,需要的是可安装q作的操作系l(农夫我习惯以" 安装套g" UCQ,而非单一的操作系l核心。当时英国的曼彻斯特늮中心QManchester Computer CenterQ简U?MCCQ便Ҏ 0.12 版核心程序制作了一套名?MCC Imterin的安装套件。随后各地的安装套g有如雨后春笋般地出现Q如国德州 Dave Safford ?TAMU QTexas A&M UniversityQ版、Martin Junius ?MJ 版、Peter McDonald?SLSQSoftlanding Linux SustemQ版{非商业安装套g的出现。在安装需求日增的情况下,Linux 安装套g创造出了一块新的需求市场。这一U商机,让非商业安装套g的也开始出现在商业市场上。Slackware 大概可算是最早出现的商业安装套g了。到如今Q商业与非商业的安装套g则已多得C清了?br /> 随着使用人数Ȁ增,核心E序的版本与功能也开始加速演化,但仍不失于稳健?br /> 1994q?3?13 日,核心E序 1.0正式发表。其安装套g在功能上的整合已急v直追当时商业版的 UNIX OS. 此时?Linux OS 已拥有数十万名用者。当时赫辛基大学还以此为由丑֊了一场名?Linux首度正式发表?. 在芬兰电视C众多传媒的郑重其事的报导下,Torvalds成了芬兰人的自豪QLinux OS宛如刚诞生的" 新? Q闪闪发亮地展现在众人眼前?<br /> 早期?Linux核心E序曾被 Andrew Tanenbaum 指出Q过度紧密地?x86处理器结合,所以他认ؓ Linux核心E序无法移植到别的处理器上。这Ҏ然与UNIX OS 的可UL性大不相同。当时的情况的确是如此,q或多或与Torvalds本h受限于拥有的g资源有关?br /> 但当 Linux的用族拓展开来之后,便开始有Z动地她ULC同的q_上。像 Dave Miller即以不下于Torvalds狂热与学习精将 Linux成功地移植到 SUN?SPARC工作站上?br /> 此外?Amiga、Atari 、PowerPc 、MIPS R4000也陆l见?Linux的n影?br /> q些UL严格C技术的角度来看Q仅能说? 个案".但这已激?Torvalds 的兴?br /> 真正撼动 Linux核心的移植是?Alpha处理器?br /> 1994q?5月,?DEC使用者协会上QDigital 的工E师 John HallQ外号MaddogQ?C?Torvalds Q双方一见如故。Maddog力劝 Torvalds Linux UL?Alpha芯片上,q主动提供了一?Alpha 计算Z Torvalds 研究使用。当q可说是全世界最快的 64-bits Alpha芯片?DEC引以的一Ҏ,其架构与功能均优过同一时期? Intel 32-bits处理器。这U技术性的挑战吸引?Torvalds 的投入。这移植,但这对原先以 x86微处理器为写作基? Linux核心E序而言Q实在不是一件小工程。在 Torvalds ?DEC相关人员的将q一q奋战后QLinux 核心E序p换骨Q成功地UL?Alpha处理器上Q与 x86处理器用同一套程序代码)?995q?3月,被戏谑是 Linux'95 ?.2 版核心程序正式发表,支持Intel x86 、DEC Alpha 、SUN SPARC 、MIPS{处理器?br /> 1996q?6月,核心E序版本?1.3直接跃升?2.0版。Torvalds本h正式钦定了一? 企鹅" 作ؓ Linux的标志。同时也开始支持对U式多重处理器(Symmetric Multi-ProcessingQ简U? SMPQ架构的计算机;而支持的处理器则又多?Motorola 68k ?PowerPc. 在自pY件团体们的努力与计算Z业业界的支持投入之下QLinux 具备的功能D商业?UNIX OS. 当然QLinux 要达? 成熟" ? E_" Q实际上q有好长的一D\要走?br /> 时至今日Q散播在全球各地?Linux虚拟发展团体Q仍旧持l地发展中。能l持C么时候?q在来的历史自有答案。但臛_在现今,一?RMS奋斗的目标——可自由分nE序代码的操作系l,已可贵地呈现在我们的眼前?<br /> 备注Q?5 Minix?Andrew Tanenbaum 教授为教学目的而撰写的操作pȝ?br /> 在教育界可算是一套学?UNIX 基础的好范本?br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M10351K6092622.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351K6092622.jpg');" border="0"><br /> <br /> <br /> <img src="http://www.oklinux.cn/upimg/20070420/11M10351N20109221.jpg" onload="if(this.width alt="" />400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351N20109221.jpg');" border="0"><br /> <br /> 新文明世U自由共?br /> 到此Q这一D关?UNIX 发展的文字,已从q去的历史当中走回到了今?#8230;<br /> … 21 世纪的今日。本文也接近֣了。请怽原谅农夫以极ؓ自n的历史感受,来作为本文的l语?br /> 阅读与探I历Ԍ是农夫个人在q轻时即有的一点小癖好。通常我无法忍受对自己喜好事物的缘׃无所知。所以我会想办法LI她p所创、因何而生与发展的沉K。也正因为如此,我才会ؓ UNIX q个当初我没能在英文字典上找的怪字Q写了这么一文字?br /> 然而在 UNIX 的发展过E当中,我惊讶地发现了一Ҏ别于我探?20 世纪历史的东ѝ?br /> 我相信诸君应该清楚,20世纪是hcL明史上最腥残暴的一D岁月。在光Q多数民族的上个世代所遭逢的苦难Q都是空前的。哲学家柏林QIsaiah Berlin Q回?20 世纪的感受,说了以下q样的一D话?br /> 「我的一生——我一定得q么说一句——经历了二十世纪Q却不曾遭逢个难?br /> 然而在我的记忆之中Q它却是西方史上最可怕的一个世U。?br /> 的确Q每当我阅读 20 世纪的相兛_料,我就更能加倍地感受到这份莫名的q运。我生长在台湾,q块回顾其历史仅能以" 悲土" UC的岛上,她的苦难直至今日亦尚未完全结束?br /> 管多数q轻的一代已然E忘,来自何方Q归往何处?br /> wؓ一个中国hQ站立在q块g仍将被同胞武力相向的孤岛?#8230;…我已不清楚历史伤口会因得到同胞的p痊愈,q是再次因hcL暴掠夺的天性而迸?#8230;… <br /> 抱歉Q离题了?br /> 我想说的是,?20 世纪未的因特|时代中Q我感受C令h喜悦圎ͼҎ于心、跨既有疆界藩q自由׃n文明。这相较?20 世纪初将" 战争" 视作为文明象征的人类而言Q实属无价可늚q展。即使这文明仍仅是刚播下的种子?<br /> 但我怿Q她如贝聿铭所aQ?br /> 「你永无法明知道你已播U的东西何时可以收割Q或许只有一ơ收成,或许可重复收成。你也许遗忘曾播U了些什么,一U经验,一U感受,与某人的关系Q抑或一U哲学及一传l。然后,忽然间就开׃Q被全然不同的环境所唤醒。这U盛开可以冲破藩篱及整个时代。?br /> 多希望亲眼看刎ͼ几个世代后的某日Qhcd此掠夺的行ؓ如天׃般地在hcȝ会中l迹Q而,׃n已成ZhcL体奉行的道d公理。如果这L一个社会是我们今日所企求的;那么Q这个方向与希望Q就值得你我׃生的_֊d力?<br /> 当然Q这仅只是一个个人的希望Q我也清楚这世间q如此好。但Q如果因假设一件事物不可能做到Q而决定不dQ那是假讑־到胜利,而非真实的事实?<br /> 或许q去的历Ԍ曄证实正义、公理、^{与理想的胜利,不过是短暂的昙花一玎ͼ那又如何。只要我们不攑ּ希望Q希望就有机会成为真实。今日,所有的好均因此得来,明日也是?<br /> q几q来Q我已看C因特网上诸君们的努力。我也相信这崭新文明的种子,有朝一日将展现Zo叏V愉悦的景。未来存在我们尚未发现的国度?<br /> 我相信,我们能发现未曾走q的通道Q打开不曾打开的门Q进入玫瑰园?#8230;…那会是一个崭新的文明?br /> <br /> <br /> 摘自Qhttp://www.oklinux.cn/html/other/unix/20070421/21330.html<br /> </font> <img src ="http://m.tkk7.com/shiliqiang/aggbug/302422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shiliqiang/" target="_blank">矛_@</a> 2009-11-15 15:56 <a href="http://m.tkk7.com/shiliqiang/archive/2009/11/15/302422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>试你的C语言掌握E度http://m.tkk7.com/shiliqiang/archive/2009/10/31/300465.html矛_@矛_@Sat, 31 Oct 2009 05:10:00 GMThttp://m.tkk7.com/shiliqiang/archive/2009/10/31/300465.htmlhttp://m.tkk7.com/shiliqiang/comments/300465.htmlhttp://m.tkk7.com/shiliqiang/archive/2009/10/31/300465.html#Feedback0http://m.tkk7.com/shiliqiang/comments/commentRss/300465.htmlhttp://m.tkk7.com/shiliqiang/services/trackbacks/300465.html 学习旉Q?.5WQ?#8220;W”周,下同Q?
知识点checklist
strlen()函数的返回值是什么类型的Q?
字符串strlen()的|是否和他占据的内存空间相同?
你是否知道strcpy函数存在的潜在风险?如何避免Q?
如果一个字W串没有字符串结束符Q而调用str开头的库函敎ͼ会发生什么?
Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的Q这些函数到底对源字W串和目标字W串做了些什么?你是否观察过它们q行时两个字W串内存的变化?
上面q些函数使用Ӟ各有哪些需要注意的地方Q?
你会几种字符串查找操作?
c语言中有字符串这个数据类型吗Q?
对字W串q行操作的时候,是否为字W串l尾W预留存储位|?不然的话Ҏ造成非常讉K内存?

数组
学习旉Q?W
知识点checklist
你肯定知道,定义“int a[10];”Qa[10]q个元素是无效的?
你知道几U数l初始化的方法?
数组和指针有千丝万缕的联p而又不同Q你是否对他们在不同情况下的使用q行q详l的ȝQ?
“int calendar[10][20];”Q这是一个什么样的数l?它拥?0数组cd的元素,q是20个?
“int a[10];”Q数l名a在本质上是一个什么?你是否打印过a的|
你知道几U获取数l某元素的方法?
指针和数l相同吗Q什么时候相同?什么时候不同?
用指针和下标讉K数组元素Q那U方式更快?

l构?
学习旉Q?W
知识点checklist
你知道什么是位域l构体吗Q如何定义它Q如何用它Q?
你知道字节对齐对l构体占用内存空间大的影响吗?如何计算l构体占用内存的大小Q?

?
学习旉Q?W
知识点checklist
你知道宏的本质是什么吗Q函敎ͼ语句Q类型定义?或者其他?
你知道语a设计者ؓ什么设计宏吗?q些原因目前是否仍然成立Q?
你会设计带有参数的宏吗?
你知道用宏的参数的的时候的注意事项吗?
你会设计带有可变参数的宏吗?
你知道用宏有什么劣势吗Q?
你有没有更好的替代方案?


枚D
学习旉Q?.5W
知识点checklist
是否可以指定枚D中各的|
如果不指定|枚D的第一个值是多少Q?
枚D的值是否可以是负数Q?
定义枚D的时候,你是否专门定义了枚D的最值和最大|


Switch
学习旉Q?.5W
知识点checklist
switch(c)中的c的数据类型有哪些Q?
你是否在所有的switch中都加了default语句Q?
是否在所有的case中都加了break语句Q一般情늚做法Q?如果你不加breakQ将会发生什么?


Static
学习旉Q?W
知识点checklist
static的三个主要作用是什么?
static的修饰的局部变量是保存在什么地方的Q全局变量?
static修饰的全局变量和函敎ͼ在其他的文g中是否可以访问?如何讉KQ?
你知道static是c语言中实现封装和隐藏的利器吗Q你是否l常使用Q?
定义在不同源文g中的static全局变量Q编译器是否允许他们的变量名U相同?他们在内存中的地址是否相同Q函数那Q?


const
学习旉Q?W
知识点checklist
你是否经怋用const来表明不能够被更改的变量Q?
你是否经怋用const帔R来代替宏Q?
下面四种情况Q你知道是各表示什么意思吗Q?
int  i_value= 10;
const  int* pvalue = &i_value
int  const *pvalue = &i_valueint*  const  pvalue= &i_value
const  int* const  pvalue = &i_value
你知道const帔R如何初始化吗Q?


Sizeof
学习旉Q?W
知识点checklist
对于字符数组Qstrlen和sizeof的值是否相同?
Sizeof本质上是函数q是宏?
Sizeof的返回值是什么类型?


指针
学习旉Q?W
知识点checklist
“int *p;”&pQpQ?p他们的值分别表CZ么含义?
你定义的指针初始化了没?
你理解指针的指针的概念吗Q你会用吗Q?
“int *pi_value; pi_value = 0x100000;” pi_value + 1的值是是多?
你会定义函数指针吗?
你会使用函数指针调用函数吗?
关于指针和数l,请参见知识点数组?


动态分配内?
学习旉Q?W
知识点checklist
动态分配的内存是保存在什么地方的Q?
什么情况下使用动态分配内存?
动态申请内存一定要释放Q否则会内存泄露。你是否使用q内存检工P


函数
学习旉Q?W
知识点checklist
如何查看函数在内存中的地址Q?
如何l一个函数指针赋|
你是否会定义可变入参函数
你是否可以区分函数的形参与实参?
如何定义函数名,以准的表达函数的用途?
你是否用const来修饰函数入参和q回|以表的特定的含义Q?
递归如何使用Q?

变量
学习旉Q?W
知识点checklist
全局变量Q局部变量,帔R分别保存在内存中的什么地方?
不同cd的变量,你是否知道其作用域?
全局变量和局部变量是否可以重名?你是否在q样做?
局部变量在函数退出后是否有效Qؓ什么?
全局变量Z么不允许定义在头文g中?有何危害Q?

链接QlinuxQ?
学习旉Q?W
知识点checklist
链接位于~译q程的那个阶D?
动态链接库和静态链接库使用时有何区别?
如何对动态链接库q行动态加载(不用重启E序而加载链接库Q?
动态链接有何优点?
动态链接库中是否定义了非static的全局变量Q你是否知道q是一个非常危险的动作Q?
动态库中的全局变量Q非staticQ和函数Q非staticQ是否可以和上层全局变量和函数重名?重名后会发生什么事情?


q行时的数据l构QlinuxQ?
学习旉Q?W
知识点checklist
你知道什么是D늚概念吗?
可执行程序可以分为几个段Q每个段保存的是什么内容?
如何查看可执行程序各个段的大?
当函数被调用时发生了什么?
你有没有试过E序的栈I间最大有多大Q程序超q此大小会发生什么?
你用的pȝ的栈是向下生长的Q还是向上生长的Q?

Include
学习旉Q?.5W
知识点checklist
1、如何避免对同一头文件的多次includeQ?


声明
学习旉Q?W
知识点checklist
什么是声明Q什么是定义Q?
你是否会q用c语言声明的优先规则Q?


关于复杂度:
软g的首要技术命是理复杂度?
优秀E序员的一个特质是复杂的事情单化Q而非简单的问题复杂化。所以,他们一般会选择单的解决Ҏ?
极尽机yQ复杂的解决ҎQ除了将新手搞得晕头转向之外Q别无他用?
阅读优秀E序员的代码Q是一Un受,你很遇到思维的阻力,你可以尽情的享受单之?
所以,寚w以理解的语言Ҏ,要慎用、少用,最好不用,而以单的解决Ҏ替代之。但是,在做q些之前Q你必须对这些知识点理解深刻?

如果你发现有什么错误,请和我联pR?
如果q些知识点你90%以上都不知道Q或者理解不深刻——我希望你可以加入DS计划Q共同学习?
如果q些知识点你90%以上都知道,q且理解深刻——我希望你也可以加入DS计划Q成为知识点专家Q对新手q行指导?
如果你知道的比上面列出的q要多,或者还有你认ؓ非常重要的,你也分n出来Q对上面列D的内容进行优化?

原文地址Q?a title="http://blog.csdn.net/chgaowei/archive/2009/10/27/4731498.aspx" target="_blank">http://blog.csdn.net/chgaowei/archive/2009/10/27/4731498.aspx
DS计划加入方式Q?
1?方式1 Q加?QQ : 93684322 ?
2?方式2 Q加?CSDN 组Q?DS计划 ?/a> 

一位网友的

寏VC方向目详细计划》的一点徏?
作者:陈新
原文Q?http://hi.csdn.net/space-1568678-do-thread-id-990.html
首先自己介绍一下,我已l工作多q_目前半管理半开发,主要使用PHP和C语言Q对于C语言有过一定研IӞ有一些经验?
我很上CSDNQ虽然已l注册了很长旉Q今天心血来潮q来看看Q就发现了常高伟的的帖子《深入学习C语言知识点checklist——测试你掌握C的程度》,仔细看了一遍,觉得q不错,q年头还执着于技术细节的人很了Q可见作者还是下了不功夫的?
接着qC“读S计划”Q觉得有Ҏ思,看完之后有了写q个的冲动,希望对大家有所帮助?

关于c语言知识Ҏw,q是挺全面的Q如果一个h大部分问题都能详l解{,说明q个人对C语言的了解还是很不错的?
不过我还是有几点Q?
1、知识点l织得不是很好,昑־有些凌ؕQ有些相关知识点被分割到了多个地方,有些不够全面Q从学习的角度来,不是非常好?
例如开始就从字W串操作讲vQ我觉得不是很好。原因是字符串操作只是库函数Q对于c语言的字W串Q我们开始只要知道是0l束够了,函数后面在慢慢学习。了解字W串函数最好的办法Q就是自己实现这些函敎ͼ然后跟源代码q行比较Q找出差距?
例如宏和IncludeQ不应该分开Q而应该作为预处理l一学习。预处理主要包括宏替换、文件包含和条g~译三部分,另外的一些慢慢再了解可以了?
此外Q我觉得应该把static、constq些限定词和变量l合在一起学习,Z把其它限定词auto、extern、register?volatile、restrict、inline{整合在一P从变量的cd(存储格式)、生命周期、作用域、可视性、存储分配等各种角度出发q行说明?
2、有些提问不是很恰当?
例如sizeof本质上是函数q是宏?因ؓsizeof既不是函敎ͼ也不是宏Q这么提问容易让Z生误解。要惛_明白sizeof具体是什么,臛_要明白编译的整个q程Q弄明白~译时和q行时的概念?
例如数组提到的定义int a[10]; a[10] q个元素是无效的。这U说法ƈ不完全正,a[10]q无效Q如果真弄明白了具体含义Q完全是可以q么使用?当然一般不推荐)?
3、学习时间的安排
像Switch、枚举之cȝQ如果有解,一天就_了。而数l应该和指针攑֜一P׃指针是c语言的难点之一Q恐?周的旉都不一定够?
4、应该把c语言的学习当作当作一个系l,分成多个阶段?
个h觉得分ؓ三个阶段比较合适:
W一阶段是c语言本nQ主要是cd、操作符、表辑ּ、语法结构、函数、指针、数l、结构等Q想完全弄清楚这些其实很不容易。入门可以参照K强的那本教U书Q不q这本书只适合了解一下,不深入,而且里面有些地方和例子都不是很好。还是推荐K&R的《The C Programming Language》,最好是英文原版的。这阶段可以同时学习《数据结构》,试实现一些链表、树的操作?
W二阶段是结合着实际情况Q加深对函数以及相关知识的认识,试着~写一些小软gQ实C些小功能。可以和《APUE》一起学习,里面讲到的例子都可以自己写一下?
W三阶段是深入学习编译原理、操作系l等知识Q了解代码是如何从文本文件一步一步变成可执行文g的,知道栈、堆分别是什么,清楚E序的存储空间布局Q库函数和系l调用的区别{。这阶段可以在某个方面深入下去,~写一个比较大的YӞ例如一个简单的|络E序、数据库pȝ或者编译器{?
因此知识点中的链接、运行时的数据结构、结构体中的内存寚w{和其它知识Ҏ在一起ƈ不是很好Q毕竟大部分其它大部分题目都是c语言本n的知识,而这些知识点不少都是要看具体实现的,甚至有些q没有标准答案?

另外Q还有一些题外话Q?
1、现在已l比较少使用c语言开发Y件了Qc语言对开发者的要求比较高,c语言不是一天两天就能掌握的Q因此首先要弄清楚自己是否真的对技术感兴趣Q对技术有U刨栚w底的冲动Q而且愿意为此花功夫。如果仅仅是x搞应用,要快速实现某个功能,而不q求效率Q不在乎具体实现方式Q最好还是去学习更高U的语言?
2?c和c++不是一个语aQ所谓c++是c语言的超集也是不正确的,如果当初c++的名U是d语言之类的,可能׃会有q么多麻烦了。最主要两者的指导思想是不一LQc语言默认其用者什么都懂,所以将一切的控制都交l开发者自己去完成Q语a本n不作太多限制Q给开发者最大的自由度。这么做的好处和坏处都是非常明显的,没有谁比谁好的问题,只有是否适用的问题?
3、语a本n只是一个工P我们了解的计算机知识发挥、展C出来的工具Q但基础知识q远比语a本n更重要。如果认为学好了一门语aQ就是所谓的高手了,那是不切合实际的。当然语a本n也需要我们花费很大精力,毕竟掌握好一个工P更能让我们的工作事半功倍?br />

摘自Qhttp://topic.csdn.net/u/20091027/22/0573CFB5-F1BF-4CF2-8E60-13D907301A8E.html

矛_@ 2009-10-31 13:10 发表评论
]]>
看看吧! 朋友?/title><link>http://m.tkk7.com/shiliqiang/archive/2009/08/24/292457.html</link><dc:creator>矛_@</dc:creator><author>矛_@</author><pubDate>Mon, 24 Aug 2009 13:45:00 GMT</pubDate><guid>http://m.tkk7.com/shiliqiang/archive/2009/08/24/292457.html</guid><wfw:comment>http://m.tkk7.com/shiliqiang/comments/292457.html</wfw:comment><comments>http://m.tkk7.com/shiliqiang/archive/2009/08/24/292457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/shiliqiang/comments/commentRss/292457.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shiliqiang/services/trackbacks/292457.html</trackback:ping><description><![CDATA[<div id="jhdhrhx" class="xspace-itemmessage" id="xspace-item94501"> <p><br /> <font color="#990099">成功l验宝典100?br /> 1、王宗立_每天早上游泳Q输入正面潜意识Q是他成Z万富豪的关键。在游泳q程中,输入正面潜意识,使其每天都保持巅峰状态?br /> 2、最重要的是要养成习惯,立即行动。感动之后是行动。一ҎL没有好,晚做L不做好?br /> 3? 要养成运动的习惯Q要L早v的习惯。运动能Ȁ发无限的力Q会使一个h感觉h非常自信。所以我要自׃持持l的q动状态。让自己一早v来就很巅峰的? 态。很多情冉|文明,生活糜烂。而你看王永庆Q台湄l营之神Q虽然年龄高?6岁,但还是每?点半起床Q跑5000公尺Q多q来一直坚持。朝? ——POWER.能量是力Q气宇非凡。早P不要己找理由Q什么我没休息够Q我昨天好篏啊,{等?br /> 4、仅仅知道还不够Q关键是要不断地训练。训既是教育Q练既是l习?br /> 5、学校不教两件事情,一是不教谈恋爱Q怎样找个好老婆怎样嫁个好老公。二是学校不教怎样**Q学校给人的教育是追求金钱意味着|恶Qh死,鸟ؓ食亡Q胦富是万恶之源?br /> 6、成功者与p|者的差别在于旉理Q运用时间的Ҏ?br /> 7、你可以d你自q命运Q!Q下定决心争取过自己惌的生zR清楚自q生活目的。你需要拥有自q梦想?br /> 一 部电影,《楚门秀》,楚门伯班Q金凯瑞饎ͼ老是觉得他一直受到监视。他没想到这竟然是真的。从他呱p地开始的三十q来Q楚门伯班就是史上播映最久、最? Ƣ迎的记录片肥皂剧的主角Q他居住的理惛_镇v景镇居然是一个庞大的摄媄,而他的亲朋好友和他每天碰到的人全都是职业演员。他生命中的一举一动分U都? 露在隐藏在各处的摄媄镜头面前。这是「楚门的世界」,全球上亿观众都注意着他的一举一动,而他自己却不自知?br /> 然后l过三十q的噩生活后,楚门 l于感到他的生活有点不对Ԍ当他发现他就像是zdȝ|里的蝴蝶时Q他军_要不计代价地逃离h镇。但是他必须面对「楚门的世界」的创始人、制作h和导 演克里斯托,q且克服他内心最大的恐惧Q才能突破藩,获得自由他在内心对自pQNOQ?I DONT WANTQ(不!我不要过q种生活Q我不要q这U受别h操纵的生z!Q王宗立借这个例子是惌明,一个h的命q是没有够操U늚Q只要他下定军_Q而且 用生命去争取Q他可以去争取他想要的东西Q过他想要的生活。你也有一合录影带Q??4时Q记录你一生,你的导演是谁呢,你是也在q一U别人操U늚? zdQ你的生zL否是在于达成别h的目的的一U工兯已呢,而不是在q你惌的生zȝ做对的事情,赯行动,下定军_Q用生命M取!<br /> 你满不满意你自己的剧本,你敢不敢梦想5q后的你Q?br /> 亚洲首富孙正义有句名a——最初所拥有的只是梦惛_毫无Ҏ的自信而已Q但是所有的一切都从这里开始?br /> 8、销售是世界上最赚钱的工作?br /> 王宗立,21岁,财富?00亿,选择业务工作?br /> q个世界上收入最高的工作是业务。他_说服M人,帮我做Q何事?br /> 销售,什么是销售,是说明、教肌Ӏ帮助别Z军_。需要三大能力:开发客P|罗q部Q缔l业务?br /> 21岁,16个月的时间赚?00万,然后4个月赔光22岁赚?00万,半年赔光Q销售房子,帮助别h做决定。h喜欢别h帮他做决定。不是选衣服,交异性朋友还是选吃什么东西,你都希望别h替你做决定?br /> 一个女人如果有两个h友,她该选择哪一个?如果你是其中之一Q你要帮她下军_Q你该如何说服她要她选择你?<br /> 二次创业p|Q失败了没关p,重要的是学到了东西没有。成功就是交学费Q早交晚交而已。越早交׃得越?br /> 在h生中必须得有一个自己又爱又敬又怕的人。他的这个又爱又敬又怕的人是他父二Ӏ?br /> 我赔q近千万的钱Q最重要的教训——千万别随便转换跑道。我见过太多的{型(转行Q失败的人。扩张是另一UŞ态的转型Q{行)?br /> 9、h要成功需有三本——本人,本钱Q本事。本人是指要亲自M解你所做的业务Q品和服务Q甚臛_体到每一个细节)Q本钱就是要有资本,本事是指你要有你的核心专长,核心的竞争力?br /> 一个h要成功,要有很多的贵人?8位数字与9位数字相差一万倍?br /> 亿万富翁靠经营管理,靠大智慧Q靠忍?br /> 老板的大忌:全天下的男h都会犯下的错误是Ԍ英雄难过h兟뀂很多h有钱C半,׃享受Q开始酒池肉林,百花丛中有花堪折,q样很快׃财富消散Q因׃是加减法而是乘除法,来得快去得也会更快。所以做领导q要有忧患意识?br /> 10、h生不在于Z而在于选择。h生的命运取决于你一刚w所做的军_?br /> 我做了哪些选择Q以致于有我辉煌的成—?3岁月入百万,26岁成Z万富,28岁收购成功杂志,两岸三地不同形态的业务Q首先要选个好的工作和职业?br /> Q?Q? 宁ؓ牛后Q不为鸡首?993q?4岁时Q日子非怸错,在忠孝东路有900q米的办公楼Q销售房CQ遇C业瓶颈,因ؓ无法copy销售模式,好象? 人打gP没有未来愿景。而会**的h都有一套模式。象麦当劻I只要按照他的q套模式Qcopy一下,p赚很多很多的钱,或者有一套模式让下属 ALONG依@可以赚׃。必要有一个KNOW HOW历史学家分析_日本之所以会成功是因为明ȝ新和大化革新。所以学?*比现?*更重要?br /> Q?Q? 底子比面子更重要Q收入比头衔更重要,实务l验比虚名更重要Q识时务者ؓ俊杰。看得到的结果比qL的未来更重要。想的未来是假的。怎样销售?说服Q怎样 卖东西?卖咖啡是在卖感觉Q卖那种走在咖啡厅外面就问到浓的香呻Iq去之后看到那些摆设和文化气息,卖咖啡是在卖文化。说的是星巴克咖啡厅?br /> ? ơ要找个好的伴G。他说他娶了一个好老婆。你要做应该做的事而不是你喜欢做的事情。我老婆很会ƣ赏我的优点Q很会崇拜我看你的眼就让你扑ֈ自信? 演讲后会很正面的评h我没有h不喜Ƣ赞,人的肯定来自于很多h的肯定,你想要别你你也要去赞美别h。我老婆的优点就是会鼓励、赞、肯定和ƣ赏? 同时Ҏ节省的女人。失败的婚姻会让人处于低潮,所以选老婆要选能助夫荫子的h。不要找一个勉强的老婆Q老公Q,q种婚姻是不会幸的Q他Q或者她Q绝? 会带l你人生的负面的东西。你所q人,你要感觉CQ她Q也很爱你。她׃的程度甚于你或至与你相当。你也许只是so so喜欢她,她却要very much喜欢你,不要找自׃相情愿喜Ƣ的女hQ否则你不会高枕无忧?br /> 再次Q关键是要激发潜能,忠于原主。他自己的例子?5q_他的原来的? 板,议员落选,新闻传媒的消息,造成很多负面的媄响,属下?1家中60安众叛亲离Q只有王宗立他没有,因ؓ他说他实在找不出更好的理q开Q经营状? 很不错, 佉K个老板很感动,要他立即承诺如果能马上开?2张支共?7.2亿的单子Q将l非怼厚的利润Q?#8230;…<br /> q样呢,他说人生是和赌,他觉得自q准了Q虽然心理也不是非常有把握,但觉得非常值得赌一把,q样他的财富一下由千万富翁变成亿万富翁。那D|间的压力非常大,但是Q要创造压力,享受压力。这h能成功!<br /> 11、均衡式的发展。训l很贵,不训l更c?br /> 12? 改变命运很重要的三个关键。其中之一是选择好的老师非常重要。众人生d看你Q力挽狂澜只一人。要想h前显贵,必先人后受罪。霸王别姬,甘之如饴。少q得 志大不幸。乐极生悌Ӏ?000q来的魔咒。骄傲就会停止学习,要高而不危。每个h都有4张AQ只是有些hq运早翻到而已Q而道路很漫长Q要时常停下来? 考,不要跨太大的步骤Q地雗他作过3个重要的决策。良师有很多包括负面的,要从负面的东西看到学习到Q从p|的h的经历里也能学习到很多东西,意见值多 钱Q不可限量。衷心的劝告。h不会永远都有好运气?br /> 齐恒公,仲Q好酒会使寡Z国吗Q好色会使寡Z国吗Q好郊游会寡h亡国吗,仲说都不会Q只有远贤臣q小人才会你亡国?br /> 13、要心怀一颗感恩的心?br /> 14、怎么pȝq用潜意识?马修史维的方法?br /> 15? Ƨ那西斯的方法。看CQ何hQ经历Q何事Q每天晚上用本子C。以军_下一ơ怎样花时间在他n上。这个不象学校教的有教无c,不能以貌取hQ而真理是 say noQ懂得拒l。待人处世一定要因h而异Q要学会拒绝否则会浪Ҏ_要交你应该交的朋友而不是你喜欢交的朋友?br /> Ƨ那西斯_要成功需要盟友,要非常大的成功就需要敌人,战友。康熙敬三碗酒,W三杯是向他的敌人敬的。他说如果没有这些hQ就不会成就的大事业。所以说益友可能是竞争对手,要学会向竞争Ҏ学习很多的东ѝ?br /> 16、功课不重要Q一定要灉|。因Z际手腕高的h会更成功?br /> 17? 如何分L朋友Q选择朋友Q选择战友Q选择敌hQ如何选择环境Q创造环境?他讲了他的三个女朋友。第一个非常爱玩,W二个非常情l化Q多愁善感,负面的情l? 非常多的人。第三个x友是说相信他会大富大贵,有非凡前途的人。崇拜,鼓励Q相信他的h。我怿我就能看?8、会学习比肯学习愿意学习来得更重要。前 车之_后R之。要试着L别h你想要学的东ѝ?br /> 19、每一个决定不是离成功来远是L功越来越q。思想军_态度Q态度军_语言Q语a军_行ؓQ行为养成习惯,习惯形成性格Q性格军_命运?br /> 20、苦q不可怕,怕就怕苦得没有代仗?br /> 21、如何做领导lMQ科学家是把单的东西复杂化,企业家是把复杂的东西单化。管理团队就是连锁hQ大量copyQ东方不败的葵花宝典Q木兰诗背下来,销售房C的脚本交战手册,实战手册?br /> 领导lM的秘诀——四句话Q开发,复制Q管理,交换?br /> 开发客P公司来做Q教业务员去做。复Ӟ让每一个h都会做。管理:l一的去理Q团队成功。一个企业里有三UhQ攻城者,开疆辟域。守城者,守天下。教l者,教育部长Q复制的工作。管理就是整合不同类型的人。交换就是资源共享,集体学习Q绝不否认每一个个体的价倹{?br /> 22、如何选项目?要看适合不适合你。你的核心专长,核心竞争力是什么?<br /> 怎样融资Q借钱Q银行的钱是借给有钱的h而不是需要钱的h。天上下雨地上滑Q自p倒自q。所以你要塑造自p利用的h|你的可被利用的h值是什么?保——呆人?br /> 23? 如何理好h才?识才Q留才,LQ用才。识才——不要找一个完无~的人,没有q种人。留才——心静而后定,心定而后安,心安而后求知求胦。养才——舍 得对你的员工投资Q投资!把员工当作你的资产。员工是最宝贵的资产,人是无h之宝。外国企业^均花3-5%d训他的员工,而中国的企业q_只花 0.03 -0.05%用来培训员工。用才——就是要把h才摆在适当的位|?br /> 24、不做什么都要有销售通\?br /> 25、Q何企业都有穷人,成功的企业家不应该停止不前?br /> 26、行善与行孝——这是h生的两g不能{待的事情?br /> 27、ؓ什么要成功比怎样成功更重要!Q!<br /> 28、世界上没有WhQ笨人都是骂出来的。所以一个赞鼓q家庭很重要?br /> 如何选择环境Q一{h创造环境,二等随环境,三等人抱怨环境。要输入正面U极的关于环境的潜意识信息。所有与我有关的一切都必将ƣ欣向荣Q不论白天与夜晚Q所有与我有关的一切都必将ƣ欣向荣。用潜意识营造一个积极的环境Q一个特别的know how.<br /> 每一天都?6400U,如果你把每天?6400U换成86400块钱Q如果没有用掉的话,会蒸发掉的,你会不会珍惜q些旉Q王永庆一分钟?万块。年龄不能代表一切。激发潜能既是有效运用时间的最x法。安东尼|宾说你每分每秒都要做最有生产力的事情?br /> 29、我使用人才的方法是Q他?0分才能,不会l他7分的z,而要相反Q这h能激发他的潜能?br /> 30、一日之计在于昨晚。做最重要的事情。所谓的最重要的事情是指非自己亲自出马不可的事情,要思?ơ,不要d那些仅仅是因己喜Ƣ做的事情。每天晚上安?仉要的事情。缔造高度的压力。辛苦不可怕,关键是辛苦要值得。要创造压力ƈ享受压力?br /> 31、每周一星。稀有性,不可替代性?br /> 32、学习催眠最重要的方法是as ifQ假装)?br /> 33? 一个h与自׃h性对抗的力量强p能取得成功。晚起床Q熬夜,吃宵夜,吸烟{都是坏习惯。一定要Lq动的好习惯。慢跑或游泳都很好。会让你两眼炯炯? 。你每天都是热情效益有力量的一天。每天v床之后对自己_生命多美好暗C性的语言Q我喜欢健康Q我喜欢保持优美的n材,我知道我q求成功……34? 当你有够的理由Q你׃作出不可思议的事情。每个h都要自问Q我现在Z自己成功的h生,可以作出什么样的决定?<br /> 35、h才最难找Q?br /> 36、四到——知道、悟到、做到、得到?br /> 37、要做那些危险而n受的事情。红色代表赚钱、竞争、占有欲和掌控性。兰色代表h、party、放杄{。绿色代表证据、数据、精性。黄色代表命感、义工、帮助h?br /> 38、学习——ؓ自己Qؓw边的hQؓ千千万万?br /> 39、你Z么能?0万美金?原因有三个。第一是你的习惯让你的收入没办法提升。包括决{的习惯、时间管理的习惯{等。第二是你所交的朋友Q要交比你强的h。第三提升你核心圈的人的品质如你理的团队的品质?br /> 40、知道不够多Q复习很重要。学习的U诀在于所谓的六圈哲学Q?00%—?0%—?5%—?2%—?%—?%QQ何h不能成功是因为没100%的h学习。所以我们要量的跟100%的h学习Q跟最优秀的学习。接q那?00%的h?br /> 41、台基集团的企业文化——孝,感恩Q存钱,竞争。早会,演讲竞赛Q每日一星。欧那西斯说一个h要获得巨大的成功必须有敌人,需要竞争才行?br /> 42、成功的法则是拿来记住的?br /> 43、教育训l者是使命传播者?br /> 44? Z可能永远处在颠峰状态,那么怎样克服低潮沮和消极的心态呢Q当你遇到挑战时Q你要想你是在高速飞行,从而才会遇C可或~的I气的阻力,从南京到? 京,你尽可以走\慢悠悠的走去Q那样不会遇到象飞机高速飞行一样遇到的dQ但是你的速度很慢很慢。恐怕要花半q时间才能到辄的地?br /> 45、不遭h忌是庸才?br /> 46? 好的环境是鼓风炉。POWER能量。当你走出去Q你会遇到挑战,你会遇到拒绝Q会有泼h的,虽然你开始还?20度的烧得通红的木炭,但一遇到h又会 逐渐降温。只有你内心的力量你自己变成一个鼓风炉Q你才又会慢慢升温到100度,200度,300度,500度,最后又辑ֈ甚至750度的火红的木炭? 你应该如何作到这一点呢Q?Q你要一遇到q些挑战Q一遇到沮的时候,你要马上在心中说QI AM& nbspFIRE Q你牺牲了自己,照亮了别人。你惛_,p赞美别hQ你惛_人鼓励,p鼓励别hQ你惛_人帮助,帮助别人?br /> 47、心理学家的实验。一? 狗,被穷q,不断的被q,直到倒在CQ嘴冒白沫,然后抽取其血Ԍ有疲x素在里面Q用q些毒素注射在一只刚吃饱的活yؕ跳的狼狗w上Q立卌昏昏? 睡,Z么?因ؓ血液L会疲劳的。h有两个器官是永远不会痛的Q一个是头发和指甲另一个是肝脏Q如果肝脏会痛这定完了?br /> 48、惟有坚持百忍,才能无所不能?br /> 49? 天下有两难,d难求人更难;世间有两苦,黄连苦,贫穷更苦Q世上有两险Q江湖险人心更险。所以要做最坏的打算。水能蝲舟亦能覆舟。一切都要能看得开Q只 有你自己不会背叛你自己,所以要投资你自己。你要爱你自己,要爱跟你有血~关pȝ亲h。世上还有两薄:春冰薄,人情更保所以要塑造自己永不被替代的h| 永远被利用的价倹{不要怪别叛你Q你要怪自己没有创造自p利用的环境。但你真的要坚持癑ֿ才能立于不|之地Q才能无所不能……处于低潮Ӟ我会惻I 如果是王永庆他会怎么做?知其难,忍其苦,其险,耐其薄,可处世也?br /> 50、感恩,_进Q严谨?br /> 51、记住别ZQ何的压力都不会压跨你Q只有自q压力会毁灭你自己。你要自己去调试自己的心c方法中Q音乐电qҎ对于调试的帮助很大。用音乐ȝ自己的痛苦?br /> 52、h一定要克服自己的沮丧?br /> 53、没有不景气Q只有不争气。y克力_——y妙地克服d?br /> 54、OPT与OPM——运用别人的旉与金钱?br /> 55? 王宗立的座右铭有三条?、在生命的历E中要告诉自己,软弱的是时候要坚强Q恐惧的是时候要勇敢Q迷惑的时候要明智Q抓不住的时候就要放手,真正的胜利是 zd自己的心中?、冷静地面对一切问题,U极不断地超自我,惜福怸消极怠惰Q活在当下就是最?、上帝赐l我镇定和沉着Q让我接受不可改变的? 情;上帝赐给我勇气和力量Q让我改变我有能力改变的事情Q上帝赐l我智慧Q让我去分L哪些事情是我有能力改变的Q哪些事情是我无法改变的?br /> 56、ؓ什么要冷静Q做业务很辛苦的Q要很善于处理危机的?br /> 57、做业务的三大法宝——走出去Q说出来Q把钱收回来?br /> 58、可怜之人必有可恨之处?br /> 59、什么是大智慧,是怎样q用心灵的智慧,心灵的力量。哀莫大于心歅R大部分人都会很沮?br /> 60、寒C能断水Q枯木也能再逢春?br /> 61、要善于q用心灵的力量。有了它Q跌倒了再爬hQ失败了再成功?br /> 62、罗伯特清崎的投资理财,四象限理论。EQSQBQI.IL爸——公家机养I最讲排场,h多hQ花最多的钱,讲气z。富爸爸——企业,Uh企业。企业是花最的p创造最大的效益Q没有获利的企业是最大的|恶。因为没有获利的企业会造成很多问题家庭?br /> 63、ƈ不是Md很多׃很有钱?br /> 64? q安定的生活有两U办法一U是?0岁之前赚了够的钱,比如?0个亿Q然后把q些钱放在银行,投资基金{。第二种是永q不要冒险,安心做一个雇员, 有职业保障但是真的有职业保障吗?没有Q!Q那些所谓的有职业保障的人只不过是在做钱的黑奴。你是否一辈子在ؓ钱做奴隶。ؓp工作?<br /> 65、你是ؓ生活而工作还是ؓ工作而生z?如果你认Z的工作是享受Q那么你是在ؓ工作而生z,否则的话Q你是在为生z而工作。你要ؓ了生z而工作?NOQ?br /> 66、你所拥有的就是最好的。只要是你的是最好的?br /> 67、S象限里是自由职业者。是做业务,赚奖金收入的人。刚开始时建立通\?br /> 王想建立的事业。把消费者变成销售者,把销售者变成领D,理者。如果不会销售就不会赚钱?br /> 68、怎样学会销售?走出去,说出来,把钱收回来?br /> 69、销售的重点是开发客P~结业务。这需?、专业知识,关于产品和服务的知识?、要知道֮购买我的产品的至?大理由?把这些理p得很熟很熟?、要提供证据Q提供见证者?、要知道CLOSE的技巧。敢于帮助别Z军_?br /> 70、客戯NO是很正常的,业务最大的困难在于胆量Q接下来的开场白Q品介l等{等。万般草木皆兵器Q资源,看到人在走\如同钱在向你招手?br /> 71、BQ利用别人的旉来帮你赚钱。h有四U,消费者——销售者——管理者——领D。销售者是说明教育帮助֮下决定的人。领D是解说者?br /> 72、怎样说服֮Q当你把产品形容得ƈ使客L信得客戯ZhDqh格时Q就成交了。hDqh格就不贵?br /> 73、要立大志才能做大事。领D就是说服,说明Q教Ԍ帮助别h下决定的人?br /> 74? I象限的hQ是投资者资本家。利用钱来赚q人。投资致富法则,沃u巴菲特的U诀——第一个法则,l对不能赔钱。就是说不能在股hg于你当初的买入h 时抛出。一定要{最好的时机。逆向思考法则。没有投资智慧,只有理胦EQ.那么怎么作到处变不惊Q少赔就好。第二条Q绝对不要忘记第一个法则。切记切记切 讎ͼ<br /> 75、世界上最恐怖的力量是复利。世界上没有聪明不聪明之分,只有懂与不懂?br /> 76、如何增加h生效率?<br /> 77、一定不能满于现状Q要巨观而不是微观?br /> 78、老板发现员工剽窃了他的智慧,资{时怎么办?他不要想不开Q你也可以挖别的企业的h才。网|别人的员工Q学习别人的智慧。创造你公司的不可被替代性。对于夫L说也是如此,要创造你在你老婆Q老公Q心目中不可被替代性。而不是一双玉臂钱人枕Q半Ҏ唇万人尝?br /> 79、h生最痛苦的事情莫q于开创和从低潮走向高潮。调整的Ҏ是不要钻牛角,而是用另外一个来代替。用催眠录音带,马修史维的方法?br /> 80、放松,放松Q毫不批判的接受成功者的指o?br /> 81? 旉理Q成功者成功的原因之一是很会理旉。把事情分ؓ四类QA——很重要又很急的QB——很重要但不很急,如运动,健康查,看书学习Q上评Q? C——很急但不重要,因h而异Q如x友要我下班接她等{。这些也许可以要别hL你做。D——既不着急也不重要。关键点是如何区分B和Ccȝ事情。急或 重要是针对目标和价D而言的。把W二天自p做的事情6大项Q在每晚做好计划。王宗立做中层管理者一般有以下6大g事情Q?、召集员工激励员工?、邀 U一l客PL访说服,如果没有臛_要去做问卯查一lCASE.3、帮助我的干部CLOSE一个客戗?、帮助我的干部救一个客戗救要退货的?? 有些情A不好的员工要鼓励Ȁ发他?、在公司亲自演示一个品说明会。培训示范作用。npd司生MU之间?br /> 82、如果一天做6仉要的事,那么一个月p?80仉要的事情Q一q能?190件事情,你能不成功吗Q?br /> 83、养成两个习惯。准备好两个本子,一个专门用于记那些你当天你遇到的hQ和事情。另一个用于记你明天要做的6件事情?br /> 84、一ҎL没有好,晚做L不做好。要做最重要的事情?br /> 85? 关于旉理的,是安东尼|宾的老师亚伯拉罕的课E。h有三U时_Focus day焦点日,专门用于处理与实现最重要的目标有关的事情。在焦点日不做Q何事除了最重要的事情之外。Buffer dayQ准备日Q不怕没有机会,怕没有准备。准备日是比如说M课,d训,M一些朋友。等{。不是去~结业务L钱,但是d之前的准备工作? Free& nbspdayQ自由日Q休息,与家人在一赗奖励,q{?br /> 86、h有四U,人物Qh才,人手Qh渣?br /> 87、全天下最长的距离是别人的钱包C的钱包的距离?br /> 88、马修史l_只要是正面的Q有力量的对你有帮助的,那么DO IT NOWQ?br /> 89、行善行孝感恩这三g事情都不能等Q不然就没有Z了?br /> 90、当别hghӞ轻视你,嘲笑你,侮i你,打击你,为难你时Q你不但不要骂他Q责怪他Q相反你要感谢他Q因Z不仅在你沮Ӟ在你的a里加满了aQ让你一路勇往直前冲到底?br /> 91、凡事没有Q何意义,除非你赋予它定义?br /> 92、h人都不是在推销产品Q而是在推销自己?br /> 93、投资大脑,回报率最高?br /> 94、完主义会杀人。不要等准备好了再说Q差不多pd。完主义会打断习惯。凡事最怕开_有了开头就会l,有l就会养成习惯,习惯׃成自Ӟ自然是?br /> 95、相信就会看见。一般h是看见了才相信。所以信念很重要?br /> 96、h无法成功的原因只有两个:懒惰和惧怕。h有三大最怕:火,高处往下蟩Q在公众面前演讲?br /> 97、不要自己挣不到钱,希望别Z破。要创造好的环境,要做正面的暗C:无论白天与夜晚,所有与我有关的一切都必将ƣ欣向荣?br /> 98、一{h创造环境,二等随环境,三等人抱怨环境?br /> 99、如果你有够的理由Q当你遇Co你兴奋得发抖的机会,你体内的火山׃自动爆发Q你心灵的巨人就会被唤醒?br /> 100、凡事皆正面Q能量永不减?/font></p> </div> <img src ="http://m.tkk7.com/shiliqiang/aggbug/292457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shiliqiang/" target="_blank">矛_@</a> 2009-08-24 21:45 <a href="http://m.tkk7.com/shiliqiang/archive/2009/08/24/292457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l典开源项目集http://m.tkk7.com/shiliqiang/archive/2009/08/21/292154.html矛_@矛_@Fri, 21 Aug 2009 11:21:00 GMThttp://m.tkk7.com/shiliqiang/archive/2009/08/21/292154.htmlhttp://m.tkk7.com/shiliqiang/comments/292154.htmlhttp://m.tkk7.com/shiliqiang/archive/2009/08/21/292154.html#Feedback0http://m.tkk7.com/shiliqiang/comments/commentRss/292154.htmlhttp://m.tkk7.com/shiliqiang/services/trackbacks/292154.html操作pȝ

Linux

目主页:http://www.linux.org/

数据?/strong>

MySQL

目主页:http://www.mysql.org/

HSQLDB(Hypersonic SQL)

目主页:http://hsqldb.sourceforge.net/

Apache Derby

目主页:http://db.apache.org/derby/

Excel JDBC Driver

Web开发框?/strong>

WebWork

WebWork是由OpenSymphonyl织开发的Q致力于lg化和代码重用的拉出式MVC模式J2EE Web框架?/p>

目主页:http://opensymphony.com/webwork/

Struts

Struts是一个基于Sun J2EEq_的MVC框架Q主要是采用Servlet和JSP技术来实现的?/p>

目主页:http://struts.apache.org/

Spring MVC

Spring MVC是结构最清晰的MVC Model 2实现

目主页:http://www.springframework.org/

EasyJWeb

EasyJWeb是基于java技术,应用于WEB应用E序快速开发的MVC框架Q框架设计构思来源于国内众多目实践Q框架充分借签了当前主要流 行的开源Web框架QStruts、JSF、Tapestry 、WebworkQ,吸取了其优点及精华,利用Velocity作ؓ模板面引擎Q是一个实C面及代码完全分ȝMVC开发框架。是一个能实现中小? Web应用pȝ快速开发的易Web框架?/p>

目主页:http://www.easyjf.com/easyjweb/

JavaServer(TM) Faces(JSF)

JavaServer(TM) Faces技术简化了JavaServer应用E序用户界面的开?各种技术水q的开发者都能够快速创建web应用E序通过在一个页面中装配一些可重复? 用UIlg;q可把这些组件与应用E序的数据源q接h;也可把客L产生的事件与服务端事件处理者连接v?q个目是Sun对JSF技术规范的最完整 实现?/p>

目主页:https://javaserverfaces.dev.java.net/

OpenBlueLab

OpenBlueLab是一个用于构建Web2.0 Portalpȝ的快速开发框架。其主页是采用该框架开发的一个Demo。Portal布局可以通过UIq行配置。Widget自动组装,在运行期? 需要编写Q何数据库交互代码p够它们自动实现数据感知。基于Ajax与HTML的form也将从XML widget定义自动构徏。XML widget定义可以从描qC息系l设计的UML模型快速生成。这个框架让你只需x信息pȝ的设计,而form和portal的系l架构将自动生成?/p>

目主页:http://www.openbluelab.org/

JSP标签

Displytag

目主页:http://displaytag.sourceforge.net/11/

AJAX框架

DWR

目主页:http://www.getahead.ltd.uk/dwr/

应用服务?/strong>

Jakarta Tomcat

目主页:http://jakarta.apache.org/tomcat/index.html

JBoss

目主页:http://www.jboss.org

GlassFish

目主页:https://glassfish.dev.java.net/

Caucho Resin

目主页:http://www.caucho.com/

Java开发工?/strong>

Eclipse

目主页:http://www.eclipse.org

NetBeans

目主页:http://www.netbeans.org

EasyEclipse

目主页:http://www.easyeclipse.org/

Jedit

目主页:http://www.jedit.org/

UML建模工具

ArgoUML

目主页:http://argouml.tigris.org/

Alma

目主页:http://www.memoire.com/guillaume-desnoix/alma/

源码理工具

SVNKit

目主页:http://svnkit.com/

JCVS

目主页:http://www.jcvs.org/

JSVN

目主页:http://www.alternatecomputing.com/jsvn/index.php3

团队协作工具

Mindquarry

目主页:http://www.mindquarry.com/

Java Enterprise TeamWork

目主页:http://jeteam.sourceforge.net/

Coefficient

目主页:http://coefficient.sourceforge.net/

Open-Xchange

目主页:http://mirror.open-xchange.org/ox/EN/community/

目理工具

Memoranda

目主页:http://memoranda.sourceforge.net/

Open Workbench

目主页:http://www.openworkbench.org/

Onepoint Project

目主页:http://www.onepoint.at/?action=setLanguage&language=en

OpenProj

目主页:http://sourceforge.net/projects/openproj

Project

目主页:http://www.project.net/

发布打包工具

JSmooth

目主页:http://jsmooth.sourceforge.net/

Launch4j

目主页:http://launch4j.sourceforge.net

VAInstall

目主页:http://vainstall.sourceforge.net/


摘自Qhttp://hi.baidu.com/computertao/blog/item/b06285335a45f8fc1a4cff6d.html



矛_@ 2009-08-21 19:21 发表评论
]]>
做java最L掌握的十Ҏ?/title><link>http://m.tkk7.com/shiliqiang/archive/2009/08/09/290450.html</link><dc:creator>矛_@</dc:creator><author>矛_@</author><pubDate>Sun, 09 Aug 2009 10:16:00 GMT</pubDate><guid>http://m.tkk7.com/shiliqiang/archive/2009/08/09/290450.html</guid><wfw:comment>http://m.tkk7.com/shiliqiang/comments/290450.html</wfw:comment><comments>http://m.tkk7.com/shiliqiang/archive/2009/08/09/290450.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://m.tkk7.com/shiliqiang/comments/commentRss/290450.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shiliqiang/services/trackbacks/290450.html</trackback:ping><description><![CDATA[<div class="fxjdxfn" id="blog_text" class="cnt"> <h1><font size="5">一个JavaE序员应该掌握的10Ҏ?/font></h1> <div id="rjdhjjp" class="detail">1、语法:必须比较熟悉Q在写代码的时候IDE的编辑器Ҏ一行报错应该能够根据报错信息知道是什么样的语法错误ƈ且知道Q何修正?br /> 2、命令:必须熟悉JDK带的一些常用命令及其常用选项Q命令至需要熟悉:appletviewer?HtmlConverter、jar? java、javac、javadoc、javap、javaw、native2ascii、serialverQ如果这些命令你没有全部使用q,那么? 对java实际上还很不了解?br /> 3、工P必须臛_熟练使用一UIDE的开发工P例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者WorkshopQ包括进行工E管理、常用选项的设|、插件的安装配置以及q行调试?br /> 4、APIQJava的核心API是非常庞大的Q但是有一些内容笔者认为是必须熟悉的,否则不可能熟l的q用JavaQ包括:<br /> ◆java.lang包下?0Q以上的cȝ功能的灵z运用?br /> ◆java.util包下?0Q以上的cȝ灉|q用Q特别是集合cMpR规则表辑ּ、zip、以及时间、随机数、属性、资源和Timer.<br /> ◆java.io包下?0Q以上的cȝ使用Q理解IO体系的基于管道模型的设计思\以及常用IOcȝҎ和使用场合?br /> ◆java.math包下?00Q的内容?br /> ◆java.net包下?0Q以上的内容Q对各个cȝ功能比较熟悉?br /> ◆java.text包下?0Q以上的内容Q特别是各种格式化类?br /> ◆熟l运用JDBC. 8Q、java.security包下40Q以上的内容Q如果对于安全没有接触的话根本就不可能掌握java.<br /> ◆AWT的基本内容,包括各种lg事g、监听器、布局理器、常用组件、打印?br /> ◆Swing的基本内容,和AWT的要求类伹{?br /> ◆XML处理Q熟悉SAX、DOM以及JDOM的优~点q且能够使用其中的一U完成XML的解析及内容处理?br /> 5、测试:必须熟悉使用junit~写试用例完成代码的自动测试?br /> 6、管理:必须熟悉使用ant完成工程理的常用Q务,例如工程~译、生成javadoc、生成jar、版本控制、自动测试?br /> 7、排错:应该可以Ҏ异常信息比较快速的定位问题的原因和大致位置?br /> 8、思想Q必L握OOP的主要要求,q样使用Java开发的pȝ才能是真正的Javapȝ?br /> 9、规范:~写的代码必ȝ合流行的~码规范Q例如类名首字母大写Q成员和Ҏ名首字母写Q方法名的第一个单词一般是动词Q包名全部小写等Q这L序的可读性才比较好?br /> 10、博学:掌握J2EE 、Oracle 、WebLogic、Jboss、Spring、Struts、Hibernate {流行技术,掌握软g架构设计思想、搜索引擎优化、缓存系l设计、网站负载均衡、系l性能调优{实用技术?/div> </div> 本文摘自Qhttp://hi.baidu.com/st_sen/blog/item/85333209ae157e2d6b60fbc9.html <img src ="http://m.tkk7.com/shiliqiang/aggbug/290450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shiliqiang/" target="_blank">矛_@</a> 2009-08-09 18:16 <a href="http://m.tkk7.com/shiliqiang/archive/2009/08/09/290450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>很有哲理的一些话Q?/title><link>http://m.tkk7.com/shiliqiang/archive/2009/08/05/289975.html</link><dc:creator>矛_@</dc:creator><author>矛_@</author><pubDate>Wed, 05 Aug 2009 09:34:00 GMT</pubDate><guid>http://m.tkk7.com/shiliqiang/archive/2009/08/05/289975.html</guid><wfw:comment>http://m.tkk7.com/shiliqiang/comments/289975.html</wfw:comment><comments>http://m.tkk7.com/shiliqiang/archive/2009/08/05/289975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/shiliqiang/comments/commentRss/289975.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shiliqiang/services/trackbacks/289975.html</trackback:ping><description><![CDATA[泪的存在Q是Z证明<a >悲伤</a>不是一场觉? <p style="text-indent: 2em;">  两h相爱Ӟ渴求无限甜蜜的吻Q但Z在争吉|Q却要用接吻的嘴互相伤害呢?     </p> <p style="text-indent: 2em;">  爱其实就像打计程车。第一Q不像公共汽车,只需{待׃自动来到你的面前Q而需要你先向 它招手才停;W二Q如果你到的是IRQ那是你的q运Q但往往车上已经有h了。这时你只能搭便车,只有先到的乘客下了R后,才能M惛_的地方;W三Q? C多少距离p付出多少代h。     </p> <p style="text-indent: 2em;">  当你认ؓ被抛弃的时候,受损q其实是对方;因ؓ他失M一个真正喜Ƣ的人,而你只不q少了一个不׃的h。  </p> <p style="text-indent: 2em;">  要做的事情L得出旉和机会,不要做的事情L得出借口。     </p> <p style="text-indent: 2em;">  令h不能自拔的,除了牙ɘq有爱情Q     </p> <p style="text-indent: 2em;">  你以为最酸的感觉是吃醋吗Q不是的Q最酸溜溜的感觉是没权吃醋,Ҏp不到你吃醋,那就是最酸最酸的。     </p> <p style="text-indent: 2em;">  青春有限Q可以骄傲的时候,管骄傲吧。有一天,当你d塌地地爱上一个h的时候,你也许无法在骄傲。     </p> <p style="text-indent: 2em;">  宠和爱是不同的两件事Q宠可以没有交流Q而爱则不能。     </p> <p style="text-indent: 2em;">  一个h有生有死,但只要你zȝQ就要以最好的方式zM厅R     </p> <p style="text-indent: 2em;">  思恋一个h?a >滋味</a>像喝了一大杯冰水Q然后用很长很长的时间流成热泪。     </p> <p style="text-indent: 2em;">  q福像掉到沙发下面的一_纽?----你专心找Q怎么也找不到Q等你E忘了Q它自己滚出来了。     </p> <p style="text-indent: 2em;">  快乐像香水Q洒在别n上的同时Q自׃会沾上一炏V     </p> <p style="text-indent: 2em;">  一只脚t在紫罗C它却香味留在了你的脚上------q就叫宽宏V     </p> <p style="text-indent: 2em;">  d我就别安慰我Q要知道每一ơ缝补,那颗心都会遭遇穿刺的痛。     </p> <p style="text-indent: 2em;">  人生好比一只杯子,杯中的水满了得施一半给人,待杯里又满了Q再施一半。只有不断地q,不断地出Q这只杯子里才会是活_才会有h倹{     </p> <p style="text-indent: 2em;">  人生试题一共有四道题目Q学业.事业Q婚姻.家庭Q^均分高才能及|切莫花太多的旉和精力在M题目上。     </p> <p style="text-indent: 2em;">  因ؓ懂得Q所?a >慈悲</a>。     </p> <p style="text-indent: 2em;">  爱情像一双袜子,是瞧v来不眼的袜子,有可能永远陪在你n边,是喜欢的漂亮袜子经怼一只.     </p> <p style="text-indent: 2em;">  微小的幸就在n边,Ҏ满是天堂。     </p> <p style="text-indent: 2em;">  只有向后才能理解生活Q但要生zdQ则必须向前看。     </p> <p style="text-indent: 2em;">  对于你来_我的出现只是你生命中?00+1=101Q但对于我来_你的出现在我的生命中却是0+1=1的算式。     </p> <p style="text-indent: 2em;">  世界上没有不伤h心的感情Q或多或,或大或小Q它都会在你的灵上留下伤痕。以伤痕Zh得感情的喜悦Q以感情的喜悦作Z痕的回报。     </p> <p style="text-indent: 2em;">  没有人因水的qxE而厌倦饮_也没有h因生zȝqxE而摒弃生zR     </p> <p style="text-indent: 2em;">  一片空白中两条l细的直U,它们从遥q的两头隐隐现出Q急急忙忙地在彼此的w体上留下一个点Q然后再ơ展向无限制的远方,一M复返。     </p> <p style="text-indent: 2em;">  爱情的开始可能是友谊Q可能是利用Q可能是ƺ骗Q也可能是需要或寂寞Q甚臛_能是报复Q可那又有什么关pdQ只要最后的l果是演变成了爱情。     </p> <p style="text-indent: 2em;">  伤害你的Z是比你强大就是比你弱。如果他比你弱小Q宽恕他Q如果他比你强大Q宽恕自己?     </p> <p style="text-indent: 2em;">  我能从一千个从我w边l过的h中听Z的脚步,因ؓ?99个h的脚是踏在地上,只有你的脚步声是t在我的心上。     </p> <p style="text-indent: 2em;">  我喜Ƣ你Q可是我不敢_我怕说了,我会dQ我不怕死Q但是我怕死了以后,再也没有Z像我一样喜Ƣ你。     </p> <p style="text-indent: 2em;">  得不C所qQ就׃所得的。     </p> <p style="text-indent: 2em;">  眼泪的温度有530℃,只是因ؓ外面的世界太P出来的时候才会降?3℃。     </p> ׃个h是在拨通电话时忽然不知道说什么好Q原来只是想听听?a >熟悉</a>的声韻I真正x通的只是自己心底的一根u <img src ="http://m.tkk7.com/shiliqiang/aggbug/289975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shiliqiang/" target="_blank">矛_@</a> 2009-08-05 17:34 <a href="http://m.tkk7.com/shiliqiang/archive/2009/08/05/289975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java推荐ȝhttp://m.tkk7.com/shiliqiang/archive/2009/07/30/289167.html矛_@矛_@Thu, 30 Jul 2009 11:25:00 GMThttp://m.tkk7.com/shiliqiang/archive/2009/07/30/289167.htmlhttp://m.tkk7.com/shiliqiang/comments/289167.htmlhttp://m.tkk7.com/shiliqiang/archive/2009/07/30/289167.html#Feedback0http://m.tkk7.com/shiliqiang/comments/commentRss/289167.htmlhttp://m.tkk7.com/shiliqiang/services/trackbacks/289167.html

矛_@ 2009-07-30 19:25 发表评论
]]>
初E序员与高E序员的做事http://m.tkk7.com/shiliqiang/archive/2009/07/27/288638.html矛_@矛_@Mon, 27 Jul 2009 13:04:00 GMThttp://m.tkk7.com/shiliqiang/archive/2009/07/27/288638.htmlhttp://m.tkk7.com/shiliqiang/comments/288638.htmlhttp://m.tkk7.com/shiliqiang/archive/2009/07/27/288638.html#Feedback0http://m.tkk7.com/shiliqiang/comments/commentRss/288638.htmlhttp://m.tkk7.com/shiliqiang/services/trackbacks/288638.html

一般对于一个问题,初E序员和高E序员考虑问题的方法绝Ҏ不同的。比如,在初U程序员阶段Ӟ他会觉得VB也能做出应用来,且看h也不错?/span>

但到了中U程序员Ӟ他可能就不会选择VB了,可能会用MFCQ这Ӟ也能做出效果不错的程序?/span>

到高U程序员Ӟ他绝对不是首先选择以上工具Q?/span>VB也好Q?/span>VC也好Q这些都不是他考虑的问题。这时考虑的绝Ҏ什么才是具有最快效率、最E_性能的解决问题的Ҏ?/span>

软g和别的品不同。比如,在Y件中要达到某个目标,?/span>nU方法,但是?/span>nU方法中Q只有一U方法或两种Ҏ是最好的Q其他的都很ơ。所以,要做一个好的系l,是很需要耐心的。如果没有耐心Q就不会有细z,有细zȝ东西才是好东ѝ我觉得做Y件是q样Q做M事情也是q样的,一定要投入?/span>

 

E序员到达最高境界的时候,想的是“我就是程序,E序是?#8221;。这时候我要做一个YӞ不会有自׃观的思\Q而是以机器的思\来考虑问题Q也是_是以程序的思考方式来思考程序,而不是以我去设计E序的方式去思考程序。这一点如果不到比较高的层ơ是不能明白的?/font>

你设计程序不是你思考问题,然后按自q思\dE序吗?

其实不是的。在我设计这个程序的时候,相当于我“?#8221;入这个程序里面去了。这时候没有我自己的Q何思维Q我的所有思维都是q个E序Q?span style="color: black;">?/span>q步该怎么赎ͼ下步该怎么赎ͼ它可能会出现什么情c?span style="color: black;">我动q个部分的时候,别的部分是否要干扎ͼ也许会动一?span style="color: black;">而牵全nQ它们之间是怎么怺影响的?

也只有到达这个境界,你的E序才能真正地写好,l对不是做个什么可视化。可视化本n是“我去设计q个E序”Q而真正的E序高手?#8220;我就是程?#8221;Q这两种Ҏl对是不同的。比如,我要?/span>VB去设计一个程序,和我本n是一个程序的思维方式Q是不一L。别Z许觉得操作系l很深奥Q很复杂Q其实,如果你到N手状态,你就是操作系l,你就能做ME序?/span>

对待软g要有一个全面的分析ҎQ光说理论是没有用的。如果你没有l过W一、第二、第三、第四这四个阶段Q则永远到达不了高境界。因为空中楼阁的理论没有用,而这些必L一步一步地d出来?/font>

一 个高U程序员应该具备开放性思维Q从里到外的所有的知识都能了解。然后,看到世界最新技术就能马上掌握,马上了解。实际上Q技术到达最高的境界后,是没? 分别的。Q何东襉K是相通的Q只要你到达q个境界以后Q什么问题一看就能明白,一看就能抓住最核心的问题,最Ҏ的根本,而不会被其他的枝叶或表象所q? 惑,做到q一步后才算比较成功?/font>

? E序员本w来_如果它到达这一步以后,他就已经形成了开阔的思维。他有这U开放性思维的话Q他p做战略决{,q对他将来做M事情都有好处。事实上Q? 会做E序后,׃有一U分析问题的ҎQ学会怎么h问题的表象剖开Q看到它的本质。这时你到M具体的问题,只要l点旉Q都能轻而易丑֜解决。实? 上,对开发计机软g来说Q没有什么做不了的YӞ所有的软g都能做,只是看你有没有时_有没有耐心Q有没有资金做支撑?/font>

q几q_其是这两三q_估计?/span>2005q前Q中国Y件这个行业里面大的Y件公司就能Ş成。现在就已经在Ş成,例如用友Q它上市后,C更加稳Z。其他大的Y件企业会在这几年内迅速长大。这时候,包括通渠道、经销商的渠道也会q速长大。也是_?/span>2005q以后,中国软gq个行业的门槛比现在q要高很多,与美国不会有太大的差别。此Ӟ中国软g才真正体现出它的威力来。如果你是这些威力中的一员,已l很厉害了?/span>

? 人可能知道比?#183;盖茨是个谈判的高手,是卖东西的高手,其实Q比?#183;盖茨从根本上来说是个E序高手Q这是他Ҏ中的Ҏ。他Ҏ有的技术都非常敏感Q一? q到本质,而且他本w也能做E序Q时常在看程序。现在他不做董事长,而做首席设计师,q时他就更加接近E序的本质。因Z本n有很开阔的思维Q又深入 到技术的本nQ所以他q道技术的方向。这对于一个公司,对他q样的h来说Q是非常重要的?/font>

如果他判断错误一步,那公总后再回头很难了。计机的竞争是非常Ȁ烈的Q不能走错半步。很多公总前看上去很火Q后来就

销声匿q了Q就是因为它走错一步,然后׃行了。ؓ什么它会走错?因ؓ他不了解技术的本质在哪里,技术的发展方向在哪里?/span>

比尔·盖茨因ؓ父母是学法律的,所以他本n很?#8220;?#8221;Q很有说服力Q而他又是做技术的Q就非常清楚技术的方向在哪里,所以他才能把方向把握得很准,公司来大。而别的公司只?/span>一阵子Q他却火了还?span style="color: black;">再火。就微软再庞大Q你如果不把握好软g技术的最前沿Q一样也会玩完。就?/span>Intel时刻把握着CPU的最新技术,才能保证自己是行业老大。技术决定它的将来?/span>

 

所以,E序员要能达到这L目标Q就要有非常强的耐心和非常好的机遇才有可能。事实上Q现在的Z挺好的,2005q? 以前Z都非常大Q以后机会会比较。但是,如果有耐心的话Q你q是会有Z的,Z都是出在耐心里。我记得有句话说“雄心的一半是耐心”Q我认ؓ雄心? 三分之二都是耐心。如果你有野心Q你p要有耐心Q你的野心才有可能实现。如果你有野心而没有耐心Q那都是胡思ؕ惻I别h一眼就能看Iѝ最后在竞争中, Ҏ一眼就看到你的意图Q那你还有什么可竞争的?



转自Q?font size="3">http://blog.pfan.cn/vagrant/31151.html



矛_@ 2009-07-27 21:04 发表评论
]]>
վ֩ģ壺 baoyu116.Ƶ| ߾ƷƵѹۿ| gv޹gvո| ɫվav| ձ߹ۿ1| ޾Ʒɫһ| þþþAVƬ| ߲| ŮƷþþþþþ| 뾫ƷA߹ۿ| þþƵ| ƷƵۿ| ɫavƷר| ޹ר| 337pŷ޴| ۺ뾫Ʒ| þAV뾫Ʒ| Ƭѹۿ| ձva߹ۿ| ղ2021| ޳˶| AVһþ| Ļר| ۺɫƵ߹ۿ| AvƷþ| Ļվѹۿ| ɫƵɫ¶¶ѹۿ| һɫþһ| һ234޿Ƶ| žžƵ| 99þþƷձһ| jjizzȫѿƬ| ͤͤѸ| ӰԺδʮվ| ˸ӰԺѿ| | ëƬƵ| ѿƷ3aƵƵ| avѸ߳ˮ| ĻƵ߹ۿ | avҹƷһ |