专注业务连续性支持与数据保护
2009-03-31关注学习

华为AR28系列路由器telnet配置已关闭评论

华为AR28系列路由器telnet配置

sysname Quidway
#
radius scheme system
#
domain system
#
local-user huawei /创建本地帐号“huawei”/
password simple huawei /设置密码为“huawei”SIMPLE为明文密码/
service-type telnet /设置服务类型为telnet/
level 3 /设置用户优先级为3,也可以设置2和1,数字小权限也就小/
#
#
interface NULL0
#
user-interface con 0
user-interface vty 0 4
authentication-mode scheme /设置scheme认证/

2008-08-11关注学习

三大计算机认证考试需理智选择 不同侧重已关闭评论

三大计算机认证考试需理智选择 不同侧重

全国计算机等级考试

全国计算机等级考试(NCRE)是经原国家教育委员会(现教育部)批准,由教育部考试中心主办,面向社会,用于考查应试人员计算机应用知识与能力的全国性计算机水平考试体系。

NCRE考试共设置四个等级:

一级:考核微型计算机基础知识和使用办公软件及因特网(Internet)的基本技能。考试科目:一级MSOffice、一级WPS Office、一级B(部分省市开考)。

二级:考核计算机基础知识和使用一种高级计算机语言编写程序以及上机调试的基本技能。考试科目:语言程序设计(包括C、C++、Java、Visual Basic)、数据库程序设计(包括Visual FoxPro、Access)。

三级:分为“PC技术”、“信息管理技术”、“数据库技术”和“网络技术”四个类别。“PC技术”考核PC机硬件组成和Windows操作系统的基础知识以及PC机使用、管理、维护和应用开发的基本技能;“信息管理技术”考核计算机信息管理应用基础知识及管理信息系统项目和办公自动化系统项目开发、维护的基本技能;“数据库技术”考核数据库系统基础知识及数据库应用系统项目开发和维护的基本功能;“网络技术”考核计算机网络基础知识及计算机网络应用系统开发和管理的基本技能。

四级:考核计算机专业基本知识及计算机应用项目分析设计、组织实施的基本技能。

NCRE考试每年开考两次,上半年开考一、二、三级,下半年开考一、二、三、四级。

全国计算机等级考试合格证书全国通用,证书上印有持有人身份证号码。自1994年开考以来,NCRE考生人数逐年递增,保守估计,累计考生已超过1500万人,获证人数超过500万人。

计算机应用技术考试

全国计算机应用技术证书考试(NIT)是教育部考试中心主办,各省级考试机构和系统承办的。它借鉴了英国剑桥大学考试委员会举办的剑桥信息技术(CIT)考试的成功经验。NIT针对用人单位录用干部、评定职称、晋升职务和上岗培训的需求,采用了系统化的设计、模块化的结构、个性化的教学、规范化的考试和国际化的标准,适合各种行业人员岗位培训的需要,给用人单位提供了一个科学、客观、统一、公正的标准。

NIT具有以下特点:

(1)系统化的设计。以建构主义学习理论的精华为指导思想,以任务驱动的原则为教学模式,采用指导评估的方式进行能力考核,侧重培养学员的实际应用技能,着重考查学员的独立操作解决问题能力。

(2)模块化的结构。根据计算机技术发展的特点和学习者在应用领域中的实际需要,在培训课程设置上紧跟计算机技术的发展,在教学过程中充分体现学员的需求,强调应用,强调技能,为用人单位提供了一个客观、统一、规范的标准,适合各种行业人员计算机培训的需要。

(3)个性化的教学。各模块课程设置灵活并与工作岗位紧密结合,不仅注重培养学员的独立操作能力,而且强调培养学员的创造精神和实践能力,便于学员根据从事的工作性质选学有关模块,同时用人单位也可根据工作性质选择所需人才的知识组合。

(4)规范化的考试。考试分为过程式考核、作业设计及上机考试三个阶段,只记成功,不记失败。学员在培训过程中根据培训考试大纲的要求完成过程式考核及作业设计,上机考试针对学员的独立操作能力和独立解决问题能力进行综合测试,由教育部考试中心统一命题。

(5)权威性的证书。合格证书由教育部考试中心签发,是持有人计算机应用能力的证明。

计算机技术与软件考试

计算机技术与软件专业技术资格考试由人事部和信息产业部组织。考生人数已达百万。最初专为软件专业人员设计,1988年开始试点,1990年起在全国普遍开考。2003年前,该考试分资格考试和水平考试两类,资格考试报考者必须是软件技术人员,对学历、工作年限有要求。水平考试没有报考限制,面向社会开考。

2004年1月1日起,该考试进行了改革,取消报考限制,面向社会各界从事计算机应用技术、软件、网络、信息系统和信息服务的专业技术人员。考试每年举行两次。

软件资格考试已纳入全国专业技术人员职业资格证书制度统一规划。人事部规定,该系列不再组织职称评审:考试取得初级资格可聘任技术员或助理工程师职务;取得中级资格可聘任工程师职务;取得高级资格,可聘任高级工程师职务。

计算机专业技术资格(水平)考试划分为计算机软件、网络、应用技术、信息系统和信息服务5个专业类别,各专业类别中分设高、中、初级。2005年考试在原有专业基础上,中级新增软件评测师、多媒体应用设计师、信息系统监理师3专业,高级新增信息系统项目管理师。开考模块有初级的程序员、网络管理员、电子商务技术员、信息处理技术员;中级设软件设计师、网络工程师、电子商务设计师、信息系统监理师;高级设信息系统项目管理师、系统分析师。考试已设初级为程序员、网络管理员;中级为软件评测师、软件设计师、网络工程师、多媒体应用设计师、信息系统监理师、数据库系统工程师;高级为信息系统项目管理师、系统分析师等。

2008-08-04关注学习

gcc参数详解已关闭评论

gcc参数详解

[介绍]
gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]
[参数详解]
-x language filename
  设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。
  可以使用的参数吗有下面的这些
  `c'', `objective-c'', `c-header'', `c++'', `cpp-output'', `assembler'', and `assembler-with-cpp''.
  看到英文,应该可以理解的。
  例子用法:
  gcc -x c hello.pig
  
-x none filename
  关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
  例子用法:
  gcc -x c hello.pig -x none hello2.c
  
-c
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
  例子用法:
  gcc -c hello.c
  他将生成.o的obj文件

-S
  只激活预处理和编译,就是指把文件编译成为汇编代码。
  例子用法
  gcc -S hello.c
  他将生成.s的汇编代码,你可以用文本编辑器察看

-E
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.
  例子用法:
  gcc -E hello.c > pianoapan.txt
  gcc -E hello.c | more
  慢慢看吧,一个hello word 也要与处理成800行的代码

-o
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈
  例子用法
  gcc -o hello.exe hello.c (哦,windows用习惯了)
  gcc -o hello.asm -S hello.c

-pipe
  使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题
  gcc -pipe -o hello.exe hello.c

-ansi
  关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏,

-fno-asm
  此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。     
-fno-strict-prototype
  只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.
  而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型
  
-fthis-is-varialble
  就是向传统c++看齐,可以使用this当一般变量使用.
  
-fcond-mismatch
  允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
  
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
  这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参数)或者 signed char(后两个参数)
  
-include file
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include
  例子用法:
  gcc hello.c -include /root/pianopan.h
  
-imacros file
  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
  
-Dmacro
  相当于C语言中的#define macro
  
-Dmacro=defn
  相当于C语言中的#define macro=defn
  
-Umacro
  相当于C语言中的#undef macro

-undef
  取消对任何非标准宏的定义
  
-Idir
  在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他
  回先在你所制定的目录查找,然后再按常规的顺序去找.
  对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找
  
-I-
  就是取消前一个参数的功能,所以一般在-Idir之后使用
  
-idirafter dir
  在-I的目录里面查找失败,讲到这个目录里面查找.
  
-iprefix prefix
-iwithprefix dir
  一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
  
-nostdinc
  使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置
  
-nostdin C++
  规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库使用
  
-C
  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
  
-M
  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c来测试一下,很简单。
  
-MM
  和上面的那个一样,但是它将忽略由#include造成的依赖关系。
  
-MD
  和-M相同,但是输出将导入到.d的文件里面
  
-MMD
  和-MM相同,但是输出将导入到.d的文件里面
  
-Wa,option
  此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
  
-Wl.option
  此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序.
  

-llibrary
  制定编译的时候使用的库
  例子用法
  gcc -lcurses hello.c
  使用ncurses库编译程序
  
-Ldir
  制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然
  编译器将只在标准库的目录找。这个dir就是目录的名称。
  
-O0
-O1
-O2
-O3
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高     
-g
  只是编译器,在编译的时候,产生调试信息。
  
-gstabs
  此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
  
-gstabs+
  此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.
  
-ggdb
  此选项将尽可能的生成gdb的可以使用的调试信息.

-static
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
动态连接库,就可以运行.

-share
  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

-traditional
  试图让编译器支持传统的C语言特性

[参考资料]
-Linux/UNIX高级编程
  中科红旗软件技术有限公司编著.清华大学出版社出版
-Gcc man page
  
[ChangeLog]
-2002-08-10
  ver 0.1 发布最初的文档
-2002-08-11
  ver 0.11 修改文档格式
-2002-08-12
  ver 0.12 加入了对静态库,动态库的参数
-2002-08-16
  ver 0.16 增加了gcc编译的4个阶段的命令

运行 gcc/egcs

**********运行 gcc/egcs***********************
  GCC 是 GNU 的 C 和 C++ 编译器。实际上, GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。
  如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。
代码:

———————–
清单 factorial.c
———————–
int factorial (int n)
{
  if (n <= 1)    return 1;   else    return factorial (n - 1) * n; } ----------------------- 清单 main.c ----------------------- #include 
#include 

int factorial (int n);
int main (int argc, char **argv)
{
  int n;

  if (argc < 2)   {     printf ("Usage: %s nn", argv [0]);     return -1;   }   else   {    n = atoi (argv[1]);    printf ("Factorial of %d is %d.n", n, factorial (n));    }   return 0; } ----------------------- 利用如下的命令可编译生成可执行文件,并执行程序: $ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.   GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 . cpp。但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C+ + 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。假设我们有一个如下的 C ++ 源文件(hello.C): #include
void main (void)
{
  cout << "Hello, world!" << endl; } 则可以如下调用 g++ 命令编译、连接并生成可执行文件: $ g++ -o hello hello.C $ ./hello Hello, world! **********************gcc/egcs 的主要选项********* gcc 命令的常用选项 选项 解释 -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 -c 只编译并生成目标文件。 -DMACRO 以字符串“1”定义 MACRO 宏。 -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 -E 只运行 C 预编译器。 -g 生成调试信息。GNU 调试器可利用该信息。 -IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 -LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 -lLIBRARY 连接时搜索指定的函数库LIBRARY。 -m486 针对 486 进行代码优化。 -o FILE 生成指定的输出文件。用在生成可执行文件时。 -O0 不进行优化处理。 -O 或 -O1 优化生成代码。 -O2 进一步优化。 -O3 比 -O2 更进一步优化,包括 inline 函数。 -shared 生成共享目标文件。通常用在建立共享库时。 -static 禁止使用共享连接。 -UMACRO 取消对 MACRO 宏的定义。 -w 不生成任何警告信息。 -Wall 生成所有警告信息。

2008-07-27关注学习

ASP.NET和PHP、JSP究竟学哪个?已关闭评论

ASP.NET和PHP、JSP究竟学哪个?

Asp.net

首先来说,Asp.net 和 Asp 没什么关系。 Asp 是脚本编程,用的是JavaScript或VbScript脚本进行编写,而ASP.net 则是使用基于.NET平台的语言如VB.NET、C#等,完全不同的东西。ASP.NET迄今为止共有四个版本:1.0、1.1、2.0、3.5它们使用的开发环境分别对应Visual Studio 2002、2003、2005、2008,当然在Visual Studio 2008支持多版本的.NET Framework,即可以在Visual Studio 2008下开发ASP.NET 2.0及3.5。

ASP.net的服务器,要求安装一个.NET Framework,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。

Asp.net属于编译语言,和ASP的最大不同(ASP属于解释语言)。

ASP.net 的速度 是 ASP不能比拟的。下面我来说下为什么ASP.net 比 ASP 快:

ASP.net 是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括 worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0,而ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。

Php

php和Asp一样也是,也是属于脚本语言,一般连接的数据库为MySql数据库,当然它也能和Access数据库和MsSq(SqlServer)数据库等其他数据库连接。他们都属于免费软件(在中国境内),也就是说他的资源是free的。

Php从安全性上比Asp要好,当然这里说的是相对而言,一个好的程序员把安全性做好的话,都差不多,不过Php的安全性要比Asp要好,为什么这么说呢。这里主要原因是这样的,PHP的搭建服务器环境相对复杂(需要安装Apache + MySql + PHP),而Asp的搭建环境比较简单(只需要安装IIS就可以了),所以学PHP的门槛比Asp的门槛要高,所以很多人就偏向Asp学习的人就多了,自然研究Asp漏洞的人就多了,而PHP会的人就少,所以研究漏洞的人就更少了,从这点来说PHP的安全性比ASP的安全性要高些。

而且还有一点就是 Apache 的环境最好是Unix,当然Windows下也是可以安装的。(Apache 是PHP的支持环境)

还有再说一点,就是MySql的效率问题,他比Access好很多倍,但是比MsSql(SqlServer)要差点。

JSP

JSP目前我还没有太多研究。总体上来说JSP的工程量巨大,任何工程都可以做到,当然是一个团队开发,3个人以上的一个团队开发,他的工期耗时也是最常的。
.NET的优势

有人问到这个问题,所以我总结了下。

.NET开发工具Visual Studo的易用性使得它在Java很难实现的“用户企业(信息系统部门)也可编程的系统”上超人一头。这可能还存在其他类似的领域。

由于Java本身较为复杂,且不易学习掌握,因此用户企业只负责企划,而将编程工作完全委托给集成商的现象非常普遍。

Java普及的主要因素很多,其中最关键的在于“开放性”。由于可各种OS上运行,而且很多开发商还提供了Web应用服务器和开发工具,因此用户可以随意选择。而开发商则通过在功能和性能方面相互竞争来不断提高产品水平。

说了半天,究竟学哪种语言好呢?.NET和JSP应该是未来发展的趋势。世界上一些大的电子商务解决方案提供商都采用JSP/Servlet和.NET框架模式。不过,偏爱PHP的开发者们也不用苦恼,精通任何一门,都是有前途的。

2008-07-27关注学习

网络工程师的学习指南已关闭评论

网络工程师的学习指南

虽然是水平第一,考试第二的,但朋友们毕竟还是以考试为目标的。说明白点,水平再高,过不了网络工程师也没说服力。
网络知识是电脑技术的十分重要的分支,除了网络之外,我们有更多更广的知识当然好,但即使不愿意承认,我也必须认可这样一个问题,就是有些知识对于通过网络工程师考试几乎没有用(说得好听些,就是对于你将来从事网络工作用处不大);甚至,有些网络知识对于通过网络工程师考试也没用,一个例子:哪怕是对ASP精通无比,对于你通过网络工程师上下午试题几乎没有任何帮助。

网络工程师跟高程一样,无法通过短期培训班之类提高水平,主要看个人长期的努力。既然好多朋友都问,该如何下手学习,我们就尝试着讨论一下,哪些资料在我们学习范围之内,这个讨论很“务实”“功利”,仅讨论如何针对网络工程师考试。

开始讨论之前,先说说到哪儿去买书,现在很多城市里面,都有针对考试的小型书店,面向公务员考试、司法考试等等,这里可以买到网络工程师教程之类的书,计算机本科自学考试的书,也是一种很好的选择。还有一些资料,这种书店买不到,需要去计算机类图书丰富的书店买。另外网上获得的资料不错,但是最好打印来看。

1、《网络工程师教程》,必看,当作指导性的大纲来看,它可以使你网络知识的结构更加清晰与合理。由于教程不完全覆盖考试内容,获取其他资料作为知识的深化和补充是绝对必须的,下面的推荐与大纲介绍的基本同步。

2、《数据通信原理》,包括通信原理和交换技术的内容,在上午肯定有一二道大题,只看教程不够。对这本书不一定看得太深,即使没有任何基础通上一两遍也不困难,可以让你提高一大步。这部分相关的内容还包括《信号与系统》,不想做硬件的朋友我觉得就不用看了。

3、网络体系结构和协议,这部分看教程即可。

4、局域网技术,先看教程,然后找一本CCNA英文教材看一遍。这样有三个好处:比教程更深入;同时提高专业英语水准;顺便学习CISCO路由器和交换机的基础知识。

5、广域网技术看教程,这部分ATM是重点,需要找别的资料深化一下(因为它流行,如CISCO流行一个道理)。

6、网络互连,先看教程。路由方面的知识教程上不够,建议有Linux环境,看看UNIX系统中的路由配置。CCNP的教程不必要全看,路由和交换看看就行,中文的也可以。

7、网络操作系统,如上,研究linux就可以。上午题目里面会有。

8、网络管理上,教程中本章前面对局域网的管理部分非常好,是每一个网络管理员都应该耳熟能详的经验。后面的SNMP不太深,但是也差不多够了,想深化的找一本《网络管理》,对snmp会有更认识。

9、网络安全,教程很概念化,如果想深入一点,看看《计算机密码学》,对加密技术能有更多感性认识(如RSA的原理,一次一密乱码本),但不用太深入。如果有条件,还可以感受一下win2000在安全方面对身份认证,鉴别,访问控制等技术的具体实现。我觉得其中有两个重要问题,访问控制和防火墙,但是这两年都没考,最好结合Cisco的学习去深化一下。

10、后面章节的内容看教程就好,还是很不错,将来做论文和实际项目,都会用上。

11、Linux教程必看,包括各种网络服务的配置(WWW,FTP),CGI现在不太时髦,可以不用看。另外如果有时间,把《网络操作系统》看一遍也很不错。

12、网络程序设计,只要有相当C语言能力,越高越好,不需要C++和Visual C(有的话更好),在Linux环境下,学习socket就可以,书方面看UNIX或LINUX网络程序设计都可以,置顶帖子里的UNIX网络程序设计是我看过的最好的。

13、网络工程师教程有一本配套的同步辅导,作一遍也好,但感觉没有本质进步,另外有一本航天出版社的《网络设计师重点分析》,那本书更没用(有抄袭之嫌)。真正的网络工程师题目往往需要你的综合能力,能够运用自己各方面的基础知识解决问题,比如2001年上午题目有一个有关路由表的问题。

14、如果感觉专业英语有欠缺,可以找一本清华的《计算机英语》,不过这不是专门面向网络英语的,可以考www.mcseguide.com订阅一份CCNA的邮件,既能学英语,又能做做题目。网上其他计算机英语读物,或是英文网站都不错,自己动手去找找,绝对可以丰衣足食。

15、越多的实践对你帮助越大,能在一个单位作网络管理最好啦。没有机会就尽量创造机会啦。

2008-07-07关注学习

LINUX下进行C语言编程基础已关闭评论

LINUX下进行C语言编程基础

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容:

源程序编译
Makefile的编写
程序库的链接
程序的调试
头文件和系统求助

1.源程序的编译

在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.

假设我们有下面一个非常简单的源程序(hello.c):

int main(int argc,char **argv)
{
printf( " "Hello Linux " ");
}

要编译这个程序,我们只要在命令行下执行:

gcc -o hello hello.c

gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.

gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.

知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.

2.Makefile的编写

假设我们有下面这样的一个程序,源代码如下:

/* main.c */
#include " "mytool1.h " "
#include " "mytool2.h " "
int main(int argc,char **argv)
{
mytool1_print( " "hello " ");
mytool2_print( " "hello " ");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */
#include " "mytool1.h " "
void mytool1_print(char *print_str)
{
printf( " "This is mytool1 print %s " ",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include " "mytool2.h " "
void mytool2_print(char *print_str)
{
printf( " "This is mytool2 print %s " ",print_str);
}

当然由于这个程序是很短的我们可以这样来编译

gcc -c main.c

gcc -c mytool1.c

gcc -c mytool2.c

gcc -o main main.o mytool1.o mytool2.o

这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?

为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:

# 这是上面那个程序的Makefile文件

main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.

下面我们学习Makefile是如何编写的.

在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:

target: components

TAB rule

第一行表示的是依赖关系.第二行是规则.

比如说我们上面的那个Makefile文件的第二行

main:main.o mytool1.o mytool2.o

表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键

Makefile有三个非常有用的变量.分别是$@,$^,$ ~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!

4.程序的调试

我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了.

最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入 -g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一个用.

5.头文件和系统求助

有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统.

比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了. 如果我们要write这个函数的说明,当我们执行man write时,输出的结果却不是我们所需要的. 因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用 man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数。

记住不管什么时候,man都是我们的最好助手。

好了,这一章就讲这么多了,有了这些知识我们就可以进入激动人心的Linux下的C程序探险活动

2008-07-07关注学习

九行代码让windows崩溃已关闭评论

九行代码让windows崩溃

目前很多地方都转载着利用9行代码使windows崩溃的文章,不过我发现没有关于为什么会使windows崩溃的分析。我先把原文给大家看看。然后把具体的细节说一下。
微软一直声称Windows XP多么多么稳定可靠,但日前一位名为Masaru Tsuchiyama的外国编程爱好者刊出了一小段C语言代码。这一只有9行的小程序如果在Windows XP/2000下运行,则可导致系统完全崩溃,并重新启动。但此程序对其他版本的Windows没有任何影响。这一产生无限循环输出的小程序的代码如下:
&#35;include
int main( void )
{
for(;{
printf( "hung up\t\t\b\b\b\b\b\b" );
print("hung up\t\t\b\b\b\b\b\b";
}
return 0;
}
如果去掉Print语句,此程序还会导致NT 4.0系统出现蓝屏错误。
但愿微软赶快修补这一漏洞。同时提醒大家,此代码只可用于研究,不得用于任何非法勾当。
如果去掉Print语句,此程序还会导致NT 4.0系统出现蓝屏错误。以上遍上网上纷纷转载的原文。

关于为什么会导致错误,就在看下面的分析吧。
\b是退格
代码是用退格符把console里的光标退成null,
然后显示任一字符(除\t),即崩溃.
但是一般情况\b是不能退出规定的区域的,
而如\b的前一个字符是\t则可以退出规定的区域(bug?).
双击运行时,系统将新建一个console,所以我们的显示在console
的左上角,我们只需两个\b就可退出屏幕(第一个吃掉\t).
原因是win32子系统意外中止导致系统崩溃.smss是windows系统建立的第一个用户进程,他的工作之一是建立csrss和winlogon进程,然后一直等待这两个进程的句柄,如果这两个进程意外中止,
smss将导致系统崩溃.csrss进程就是专门负责所有win32进程和系统进行通信的进程.所有win32进程的系统调用都会由csrss帮你完成,但是这样做因为需要进程切换所以效率太低.所以在windowsNT从3.51升级到4.0时将许多部分从用户态移入内核态,win32进程的系统调用将直接进行以减少进程切换时间.但是仍有少量系统调用需要csrss进程完成,据我所知createprocess
是这样的函数,所有console上的显示是这样的函数(还有其他的).
当我们调用printf("\t\b\ba")最终将调用WriteFile API.
WriteFile((HANDLE)7,"\t\b\ba",NULL,NULL)等同于
printf("\t\b\ba"),7是console标准输入的句柄.
WriteFile判断句柄类型,如是文件句柄将调用ntdll.dll中的
NtWriteFile函数.如是console句柄将调用WriteConsoleA函数.
WriteConsoleA函数将调用ntdll.dll中的csrClientCallServer
函数通知csrss进程,然后调用NtRequestWaitReplyPort等待结果.
估计是csrss进程在处理这个请求过程中出错了.
几年前侯杰老师分析后我整理出来的。因为没有地方说过,甚至简单的分析都没有,所以我才把他翻出来 :) 细心的人发现csrss出错的细节没有描述,谁有时间就补充一下吧..