您的位置:首页 > 运维架构 > Linux

Linux入门回顾

2016-02-08 13:48 537 查看
Unix是一种多用户、多任务操作系统。

Unix(Linux)程序和系统的特点:

1、简单性:KISS——Keep It Small and Simple

2、集中性:单一目标程序,组合小工具完成复杂任务

3、可重用组件:核心库,简单灵活的编程接口

4、过滤器:对输入进行转换并产生输出

5、开放的文件格式:纯ASCII文本,XML文件……

6、灵活性:不能期待程序被非常正确地使用

        Linux是可以自由发布的类Unix内核实现,是一个操作系统的底层核心,Linux程序和Unix程序非常相似,几乎所有为Unix编写的程序都可以在Linux上编译运行,其开发目的是保证Linux除包含可以自由发布的代码外,不会集成任何专有代码。

        Linux社区(以及其他的软件开发组织)支持自由软件的概念,即软件本身不应受限,它们应遵守GNU通用公共许可证(GPL),获得软件(通常是以源代码的形式发布)可能要支付一定费用,但可以随意使用。

GPL条款下发布的一些主要GNU项目软件:

1、GCC:GNU编译器集,包括GNU C编译器

2、G++:C++编译器,是GCC的一部分

3、GDB:源代码级的调试器

4、GNU make:UNIX make命令的免费版本

5、Bison:与Unix yacc兼容的语法分析程序生成器

6、bash:命令解释器(shell)

7、GNU Emacs:文本编辑器及环境

Linux系统编程的可选语言:

        Ada、C、C++、Eiffel、Forth、Fortran、Icon、Java、JavaScript、Lisp、Modula 2、Modula 3、Oberon、Objective C、Pascal、Perl、PostScript、Prolog、Python、Ruby、Smalltalk、PHP、TCL/Tk、Bourne Shell

Linux应用程序:

1、可执行文件是计算机可以直接运行的程序,相当于Windows中的.exe文件

2、脚本文件是一组指令的集合,指令由另一个程序——解释器来执行,相当于Windows中的.bat文件、.cmd文件或解释执行的BASIC程序

Linux不要求可执行文件或脚本文件具有特殊的文件名或扩展名,文件系统属性用来指明一个文件是否为可执行的程序。

        Shell程序在一组指定的目录路径下按照给出的程序名搜索与之同名的文件,搜索的目录路径存储在shell变量PATH里,搜索路径可配置,通常包含:/bin、/usr/bin、/usr/local/bin,系统管理员还会包括/sbin和/usr/sbin。

Windows:“\”和“;”

Linux:“/”和“:”

编写、编译和运行第一个Linux程序

编写:

#include <stdlib.h>
int main(void)
{
puts(“Hello World”);
exit(EXIT_SUCCESS);
}

编译:

gcc –o hello hello.c
运行:

./hello
如果忘了-o name,则自动生成a.out可执行文件。

Linux开发人员需要了解软件工具和开发资源在系统中存放的位置,重要的文件和目录:

1、应用程序

        系统为正常使用提供的程序,包括用于系统开发的工具,都可以在目录/usr/bin中找到;

        系统管理员为某个特定的主机或本地网络添加的程序通常可在目录/usr/local/bin或/opt中找到。

2、头文件

        C语言头文件几乎总是位于/usr/include目录及其子目录中;

        依赖于特定Linux版本的头文件通常可在目录/usr/include/sys和/usr/include/linux中找到。

        X视窗系统:/usr/include/X11

        GNUC++:/usr/include/c++

        调用C语言编译器时,可以使用-I标志来包含保存在子目录或非标准位置中的头文件,例如:gcc –I/usr/openwin/includefred.c

在当前目录下的所有以.h结尾的文件中搜索字符串EXIT_:grep EXIT_ *.h

3、库文件

        标准系统库文件一般存储在/lib和/usr/lib目录中,库文件必须遵循特定的命名规范并且需要在命令行中明确指定。

        库文件的名字总是以lib开头,随后的部分指明何种库(c代表C语言库,m代表数学库),文件名的最后部分以.开始,然后给出库文件的类型:.a代表传统的静态函数库,.so代表共享函数库。

例如:

gcc -o fred fred.c /usr/lib/libm.a
gcc –o fred fred.c –lm

        -lm代表的是标准库目录中名为libm.a的函数库,另一个好处是如果有共享库,编译器会自动选择共享库。

库文件和头文件一样,通常保存在标准位置,也可以通过使用-L标志为编译器增加库的搜索路径,例如:

gcc –o x11fred –L/usr/openwin/lib x11fred.c –lX11


4、静态库

静态库也称作归档文件(archive),以.a结尾

编写源文件:

//lib.h
#include <stdio.h>
void fred(int);
void bill(char *);

//fred.c
#include “lib.h”
void fred(int arg)
{
printf(“fred: we passed %d\n”, arg);
}

//bill.c
#include “lib.h”
void bill(char * arg)
{
printf(“bill: we passed %s\n”, arg);
}
编译产生目标文件,-c阻止编译器创建一个完整的程序:

gcc –c bill.c fred.c(产生bill.o、fred.o)
测试驱动程序:
//program.c
#include <stdlib.h>
#include “lib.h”
int main(void)
{
bill(“Hello World”);
exit(EXIT_SUCCESS);
}
gcc –c program.c
gcc –o program program.o bill.o
./program


创建库文件:

(使用ar程序创建一个归档文件并将目标文件添加进去,ar的功能是将若干单独的文件归并到一个大的文件中以创建归档文件或集合)

ar crv libfoo.a bill.o fred.o


生成内容表:

(在某些系统,尤其是从Berkeley UNIX衍生的系统中,要想成功地使用函数库,还需要为函数库生成一个内容表,在Linux中,当使用的是GNU的软件开发工具时,这一步骤不是必须的)

ranlib libfoo.a
测试:

gcc –o program program.o libfoo.a
./program
也可以使用-l选项:

gcc –o program program.o –L. –lfoo
        如果使用nm命令查看program和libfoo.a,会看到函数库libfoo.a中包含fred和bill两个函数,而program中只包含函数bill。当程序被创建时,只包含函数库中它实际需要的函数,虽然程序中的头文件包含函数库中所有函数的声明,但这并不会将整个函数库包含在最终的程序中。

与Windows的相似之处:

项目UnixLinux
目标模块func.ofunc.obj
静态函数库lib.alib.lib
程序programprogram.exe
5、共享库

        静态库的一个缺点是:当同时运行许多应用程序并且都是使用来自同一个函数库的函数时,内存中就会有同一函数的多份副本,而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间。

        当一个程序使用共享库时,链接方式为:程序本身不再包含函数代码,而是引用运行时可访问的共享代码。当编译好的程序被装载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要,共享库才被加载到内存中。

        通过这种方法,系统可以只保留共享库的一份副本供许多应用程序同时使用,并且在磁盘上也仅保存一份。另一个好处是共享库的更新可以独立于依赖它的应用程序。

        对Linux系统来说,负责装载共享库并解析客户程序函数引用的程序(动态装载器)是ld.so,也可能是ld-linux.so.2、ld-lsb.so.2或ld-lsb.so.3。用于搜索共享库的额外位置可以在文件/etc/ld.so.conf中配置,如果修改了这个文件,需要执行命令ldconfig来处理它。

        可以通过运行工具ldd来查看一个程序需要的共享库。

        共享库在许多方面类似于Windows中使用的动态连接库。.so库对应于.dll文件,都是在程序运行时加载,而.a库类似于.lib文件,它们都包含在可执行程序中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux