Linux 学习技术向TECH_LINUX

Linux常用系统命令

2017-08-28  本文已影响420人  Juinjonn

这些命令基于Ubuntu16.04系统,其他版本或系统可能微有不同

1.Shell

1.1Shell家族

Shell:命令解析器,根据输入的命令执行相应命令。
查看当前系统下有哪些shell:

cat /etc/shells

查看当前系统正在使用的shell

echo $SHELL

常见shell:

    /bin/sh         (已经被bin/bash所取代)

    /bin/bash       (Linux默认的shell)

    /bin/ksh        (kornshell这个 shell 可交互式的从终端键盘或从一个文件中执行命令)

    /bin/tcsh       (整合 C Shell ,提供更多的功能)

    /bin/csh        (已经被tcsh所取代)

    /bin/zsh        (基于 ksh 发展出来的,功能更强大的shell)

1.2Bash

bash是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again Shell这是关于Bourne shell(sh)的一个双关语(Bourne again/born again)

bash是许多Linux平台的内定shell,事实上还有许多传统Unix上用的shell,像tcsh、csh、ash、bsh、ksh等等,shell script大致都类同,当您学会一种shell以后,其他的shell会很快就上手,大多数的时候,一个shell script通常可以在很多种shell上使用。

bash是大多数Linux系统以及mac OS 默认的shell,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟借口。此外,它也被DJGPP项目移植到了MS-DOS上。

1.3命令和路径补齐

在bash下敲命令时,tab键可以补全已经敲了一部分的文件名和目录名。如果是Ubuntu系统,系统默认启用了bash completion,还可以补全命令的某些参数、Makefile目标等等。如果是Debian系统,可以用以下命令启用bash completion:

    $source /etc/bash_completion

建议将这一行加入~/.bashrc启动脚本中。比如使用sudo后面接命令,如果没有bash completion则只有sudo可以补全,后面的命令不能补全。如果启动了bash completion,则后面的命令,包括命令的某些参数(比如aptitude命令的install)都可以补全了。

比如在主目录下要列出桌面目录的内容,输入(不回车)

    $ls  De

然后敲tab键,如果以De开头的文件或文件夹只有Desktop一个,就自动补全为

    $ls Desktop

否则,再敲一次tab键,将会把所有以De开头的文件或文件夹列在下面供你选择(在这里我们手动创建另外一个以De开头的文件)

    $touch Death

    $ls De

    Death    Desktop/

你可以再补敲一个s再tab,这次Desktop就会补全到命令后面了。
有的人是DOS时代过来的,留下一个很不好的习惯就是在找一个文件时反复的cd、ls、cd、ls…等找到了要找的文件时再想回到先前的目录,已经不记得先前是从哪个目录转到这里来的了。

我们从上面可以看出,tab补全本身就具备了ls的功能,上面的tab补全相当于ls –Fd De*命令。所以我们完全不必反复的cd到别的目录然后ls去找文件,多按几次tab就可以一条命令完成了,这样的好处是我们的当前目录不用变,不需要找完了文件再cd回来,同时省去了大量的按键次数。更重要的是,自动补全同时兼具了检查拼写错误的功能,如果前面几个字母拼写错了,就补全不出东西来,用户就知道拼写错了,如果前面几个字母没有品写错,那么由系统补全出来的文件名肯定也不会有拼写错误,避免了用户在敲很长的文件名时易犯的拼写错误。

1.4历史记录

历史记录是另外一个非常方便的功能。按上下移动光标键(或者ctrl-p、ctrl-n)可以一条一条浏览以前输过的命令。如果有需要重复输入的命令就不用输第二次了。如果你能记住以前输过的某条命令中的某个关键字,可以按ctrl–r,然后输入关键字,随着你每输入一个字母,bash会做增量式(increasingly)查找,也可以反复按ctrl-r或ctrl-s向前向后查找。如果找到了,按左右移动光标键或home键(ctrl-a)或end键(ctrl-e)将该命令带回提示符下进一步修改,或者直接按enter键原封不动的执行该命令

1.5主键盘快捷键

bash的快捷键和emacs保持一致,用惯其中之一再用另一个程序会很顺手的。请记住一条原则:尽量使用主键盘快捷键而不使用移动光标键和编辑键。因为手不必离开主键盘是效率最高的,这样在你一生之中所节省的来回移动手的时间绝对可以用星期来计算,是绝对值得你花十分钟的时间记住这些快捷键的。

功能 快捷键 助记
Ctrl-p previous
Ctrl-n next
Ctrl-b backward
Ctrl-f forward
Del Ctrl-d delete光标后面
Home Ctrl-a the first letter
End Ctrl-e end
Backspace Backspace delete光标前面

2.目录和文件

2.1类Unix系统目录结构

Linux系统,不像现在Windows版本这样,硬盘存在各个盘符的情况,没有盘符的这个概念,只有一个根目录/,所有文件都在它下面
/ 根目录

|---    bin      //系统可执行程序,如命令

|---    boot     //内核和启动程序,所有和启动相关的文件都保存在这里

|---  grub     //引导器相关文件

|---  dev      //设备文件

|---  etc       //系统软件的启动和配置文件,系统在启动过程中需要读取的文件都在这个目录。如LILO参数、用户账户和密码。

|---  media    //挂载媒体设备,如光驱、U盘等

|---  mnt      //目录是让用户临时挂载别的文件系统,如挂载windows下的某个分区,ubuntu默认还是挂载在/media目录

|---  opt      //可选的应用软件包(很少使用)

|---  proc     //这个目录是系统内存的映射,我们可以直接访问这个目录来获取系统信息。也就是说,这个目录的内容不在硬盘上而是在内存里。

|---  sbin  //管理员系统程序

|---  selinux

|---    srv

|---    sys      //udev用到的设备目录树,/sys反映你机器当前所接的设备

|---  tmp     //临时文件夹

|---  usr       //这是个最庞大的目录,我们要用到的很多应用程序和文件几乎都存放在这个目录下。

        |---   bin       //应用程序

        |---   game     //游戏程序

        |---   include

        |---   lib       //应用程序的库文件

        |---   lib64     

        |---   local        //包含用户程序等

        |---   sbin       //管理员应用程序

2.2用户目录

位于/home/user,称之为用户工作目录或家目录,表示方式:

    /home/user

    ~

2.3相对路径与绝对路径

绝对路径
从/(根目录)开始描述的路径为绝对路径,如:

 cd /home

 ls /usr

相对路径
从当前位置开始描述的路径为相对路径,如:

    cd ../../

    ls abc/def

...:
每个目录下都有..
.表示当前目录
..表示上一级目录,即父目录
根目录下的...都表示当前目录
Linux...Windows系统的文件目录大体相同的意思.

2.4目录内容

ls
ls [OPTION]...[FILE]…
ls是英文单词list的简写,其功能为列出目录的内容。这是用户最常用的一个命令,因为用户需要不时的查看某个目录的内容。该命令类似于DOS下的dir命令。对于每个目录,该命令将列出其中的所有子目录与文件。对于每个文件,ls将输出其文件名以及所要求的其他信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或是文件名时,就显示当前目录的信息。

主要的OPTION有:

-a 列出隐藏文件,文件中以”.”开头的均为隐藏文件,如:~/.bashrc

-l 列出文件的详细信息

-R 连同子目录中的内容一起列出

用ls –l命令显示的信息中,开头是由10个字符构成的字符串,其中第一个字符表示文件类型,它可以是下述类型之一:

-   普通文件

d   目录

l   符号链接

b   块设备文件

c   字符设备文件

s   socket文件,网络套接字

p   管道

后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示对文件的读、写和执行权限。各权限如下所示:

r   读

w   写

x   可执行。对于目录,表示进入权限。

s   当文件被执行时,把该文件的UID或6ID赋予执行进程的UID(用户ID)或6ID(组ID)。

t   设置标志位(sticky bit)。如果拥有者或文件属主删除。如果是由sticky bit的可执行文件,在该文件执行后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快的装入该文件。

-   没有相应位置的权限

访问权限后面的数字表示与该文件共享inode的文件总数,即便链接数(参见下面ln命令)。

2.5切换目录

cd
change dir 改变当前所在路径

cd ~
cd dir1/dir2
cd ..

2.6查看命令路径

which
查看指定命令所在路径

which ls

2.7查看路径

pwd
Linux中用 pwd命令来查看"当前工作目录"的完整路径。简单得说,每当你在终端进行操作时,你都会有一个当前工作目录。在不确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置

pwd

2.8创建目录

mkdir [OPTION] DIRECTORY ....
创建目录DIRECTORY,可以一次创建多个。
要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。并且,所创建的文件夹(目录)不能与其父目录(即父文件夹)中的文件夹重名,即同一个目录下不能有同名的(区分大小写)。

-m, --mode=模式,设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask

-p, --parents  可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; 

-v, --verbose  每次创建新目录都显示信息

    mkdir test

    mkdir –p test1/test2

2.9删除空目录

rmdir [OPTION]... directory
删除空目录,可以一次删除多个。
OPTION如果是-p,表示可以连同空的父目录一起删除。
mkdir和rmdir的用法举例:

    $ mkdir  a

    $ mkdir a/b

    $ ls  a

    b

    $ rmdir  a/b

    $ ls  a

    $ rmdir a

    $ mkdir  a/b

    mkdir:cannot create directory ‘a/b’:No such file or directory

    $ mkdir –p  a/b

    $ rmdir –p  a/b

2.10修改文件时间

touch [OPTION] ..... FILE.....
将每个文件的访问及修改时间都更新为目前的时间。
如果文件不存在,则创建一个字节数为0的文件。

2.11删除文件/目录

rm
删除文件:

rm  file

删除目录:

rm  dir  -rf

2.12重命名/移动文件

mv
重命名:

mv  file1  file2

移动文件:

mv  file ~/

2.13拷贝文件/目录

cp
拷贝文件:

  Cp file1 file2

  Cp file1 dir/

  Cp file1 ../

拷贝目录:

  Cp dir1 dir2 –r

  Cp dir1 ~/ -r

2.14查看文件内容

cat
查看文件里内容,输出到终端,如果cat时没跟文件名,则读标准输入,遇到\n后,输出到标准输出,终端下输入ctrl -d表示结束。

2.15查看文本文件内容

more [OPTION] FILE ....
查看文本文件内容,屏幕显示完一屏就等待用户按下任意键再滚动到下一屏,如果中途不想继续看下去了,可以按ctrl c或q终止显示。
less [OPTION] FILE ....
查看文本文件内容,屏幕显示完一屏就等待用户按键,用户可以向上或向下查看,如果中途不想继续看下去,可以按ctrl c或q终止显示。

2.16显示文件的前面/最后几行

head [OPTION] ..... FILE....
显示指定文件的前面几行。如果没有指定文件,将从标准输入(键盘)上读取。如果没有指定要显示的行数,则默认显示前10行。如果要显示文件的前5行。

head -5 file1

tail [OPTION].... FILE ....
显示文件的最后几行。若没有指定显示的行或字符数,则默认显示末尾10行。如果要显示文件末5行。

tail  -5   file1

2.17链接

ln
链接有两种,一种被成为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link),建立硬链接时,链接文件和链接文件必须位于同一文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下,ln产生硬链接。如果给ln命令加上-s选项,则建立符号链接,则建立符号链接。
例:

//硬链接:
    touch hello

    ln hello word_h
//软链接:
    Ln –s hello word_s

2.18树形显示目录文件

tree
这个命令需要下载安装,ubuntu下

//安装命令
sudo apt-get install tree

按结构树的形状显示目录和文件。

2.19计算文件

wc
利用wc指令我们可以计算文件的byte数,字数,或是列数,若不指定文件名称,或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

-c 或 –bytes 或 –chars 只显示bytes数。

-l 或 –lines 只显示列数。

-w 或 –words 只显示字数。

例:

wc   -l   ./*

2.20数据显示格式

od

od   -tcx  file1

-t 指定数据的显示格式,主要参数有:

c ASCII字符或反斜杠序列

d [SIZE] 有符号十进制数,每个整数SIZE字节。

f [SIZE]  浮点数,每个整数SIZE字节。

o [SIZE] 八进制(系统默认值为02),每个整数SIZE字节。

u [SIZE] 无符号十进制数,每个整数SIZE字节。

x [SIZE] 十六进制数,每个整数SIZE字节。

2.21查看目录大小

du
查看某个目录的大小:
例:

//Juinjonn为用户目录
以M(兆)为单位。
du  -hm  /home/Juinjonn/test
-----------------------------
以B为单位
du –hb ./home/Juinjonn/test
-----------------------------
以K为单位,4K的整数倍
du –hk ./home/Juinjonn/test
-----------------------------

2.22查看磁盘使用情况

df

df –block-size=GB

df –block-size=MB

3.文件属性和用户用户组

3.1查看当前登录用户

whoami

3.2更改文件目录访问权限

chmod
文字设定法

chmod [who] [+|-|=] [mode]文件名

操作对象who可是下述子母钟的任一个或者他们的组合:

u 表示”用户(user)”,即文件或目录的所有者。
g 表示”同组(group)用户”,即与文件属主有相同组ID的所有用户。

o 表示”其他(others)用户”。

a 表示”所有(all)用户”。它时系统默认值。

操作符号可以是:

+ 添加某个权限。

- 取消某个权限。

= 赋予给定权限并取消其他所有权限(如果有的话)。

设置mode所表示的权限可以用下述字母的任意组合:

r  可读。

w  可写。

x  可执行

数字设定法
chmod [mode] 文件名
我们必须首先了解用数字表示的属性的含义:

0表示没有权限,

1表示可执行权限,

2表示可写权限,

4 表示可读权限,

然后将其相加。所以数字属性的格式应为3个从0到7的八进制,其顺序是(u)(g)(o)。
例如,如果想让某个文件的属性有"读/写"两种权限,需要把4(可读)+2(可写)=6(读/写)。
比如设置一个文件允许所有用户可写

chmod a+w file1

设置一个文件允许所有用户可读,可写,不可执行

chmod 666 file1

 

        user        group         other

      r  w  x      r   w   x     r   w  x

      4  2  1      4   2   1     4   2  1

        5              6             3


3.3更改文件目录的用户或组

chown
chown [OPTION]… [OWNER:GROUP] FILE…
chown [OPTION]… -reference=RFILE FILE…
更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户A,为了让用户A能够存取这个文件,root用户应该把这个文件的属主设为A,否则,用户A无法存取这个文件。

OPTION的主要参数:

-R  递归式的改变指定目录及其下的所有子目录和文件的拥有者。

-v  显示chown命令所做的工作。

比如把一个文件改为Juinjonn用户和nogroup用户组所有:

sudo chown Juinjonn:nogroup  file1

注意:
chown 需要特权用户才能执行
一个文件的owner和owning group 是没有关联的。一个文件属于用户A,也属于用户组B,并不表示用户A属于用户组B。

3.4改变文件的用户组

chgrp
chgrp [OPTION]… GROUP FILE …
chgrp [OPTION]… -reference = RFILE FILE…
该命令改变(指定)指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通赔符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。
OPTION的主要参数:

-R 递归式的改变指定目录及其下的所有子目录和文件的属组

4.查找与检索

4.1文件名查找

find
根据文件名查找
find [OPTION] path… [expression]
在目录中搜索文件,path指定目录路径,系统从这里开始沿着目录树向下查找文件。它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。Expression是find命令接受的表达式,find命令的所有操作都是针对表达式的。
一条最常用的find命令------在当前目录及子目录下查找所有以file开头的文件名。

 find .-name ‘file*’

 find /-name ‘vimrc’

 find ~-name ‘*.c’

4.2内容检索

grep
grep [options] PATTERM [FILE…]
在指定文件中搜索特定的内容,并将含有这些内容的行输出到标准输出。若不指定文件名,则从标准输入读取。
[options]部分包含的主要参数:

-c : 只输出匹配行的计数。

-i: 不区分大小写(只适用于单字符)。

-h : 查询多文件时不显示文件名。

-l : 查询多文件时只输出包含匹配字符的文件名。

-n: 显示匹配行及行号。

-s: 不显示不存在或无匹配文本的错误信息。

-v:显示不包含匹配文本的所有行。

-R:连同子目录中所有文件一起查找。

比如到系统文件目录下查找所有包含printf的文件

grep ‘printf’ /usr/include -R

5.安装卸载文件

5.1apt - get

更新源服务器列表

sudo vi /etc/apt/sources.list

更新完服务器列表后需要更新下源:

    sudo apt-get update     更新源

    sudo apt-get install package 安装包

    sudo apt-get remove package 删除包

    sudo apt-cache search package 搜索软件包

    sudo apt-cache show package 获取包的相关信息,如说明、大小、版本等。

    sudo apt-get install package  ---reinstall  重新安装包

    sudo apt-get –f install 修复安装

    sudo apt-get remove package –purge 删除包,包括配置文件等

    sudo apt-get build-dep package  安装相关的编译环境。

    sudo apt-get upgrade 更新已安装的包

    sudo apt-get dist-upgrade 升级系统

    sudo apt-cache depends package  了解使用该包依赖哪些包

    sudo apt-cache rdepends package 查看该包被哪些包依赖

    sudo apt-get source package   下载该包的源代码

    sudo apt-get clean && sudo apt-get autoclean  清理无用的包

    sudo apt-get check 检查是否有损坏的依赖

5.2deb包安装

安装deb软件包命令:         sudo dpkg –I XXX.deb

删除软件包命令:            sudo dpkg –r XXX.deb

连同配置文件一起删除命令:    sudo dpkg –r –purge XXX.deb

查看软件包信息命令:         sudo dpkg –info XXX.deb

查看文件拷贝详情命令:       sudo dpkg –L xxx.deb

查看系统中已安装软件包信息命令: sudo dpkg -l

重新配置软件包命令:            sudo dpkg –reconfigure xxx

5.3源码安装

  1. 解压缩源代码包

  2. cd dir

  3. ./configure
    检测文件是否确实,创建Makefile,检测编译环境

  4. make
    编译源码,生成库和可执行程序

  5. sudo make install
    把库和可执行程序,安装到系统路径下

6.磁盘管理

6.1mount

命令格式:
mount [-t vfstype] –o options device dir
其中:

-t vfstype 指定文件系统的类型,通常不必指定。mount会自动选择正确的类型。常用类型有:

光盘或光盘镜像:iso9660

DOS fat16文件系统:msdos

Windows 9x fat32文件系统:vfat

Windows NT ntfs文件系统:ntfs

mount windows文件网络共享:smbfs

UNIX(LINUX) 文件网络共享:nfs

-o options 主要用来描述设备或档案的挂接方式。常用的参数有:

loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备

rw:采用读写方式挂接设备

iocharset:指定访问文件系统所用字符集

device:要挂接(mount)的设备

dir设备在系统上的挂接点(mount point)。

6.2卸载

卸载命令umount

sudo umount 挂载点

6.3拷贝

dd
例:拷贝光碟(注意,你的光碟是标准的iso9660格式才可以这么做)

    dd if=/dev/cdrom of=cdrom.iso

例2:将文件sfile拷贝到文件dfile中。

    dd if=sfile of=dfile

例3:创建一个100M的空文件

dd if=/dev/zero of=hello.txt bs=100M count =1
/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!

/dev/zero,是一个输入设备,你可你用它来初始化文件,从里面独处来的数据都是0.

7.压缩包管理

7.1tar

tar [主选项+辅选项] 文件或者目录
tar可以为文件和目录创建档案。利用tar命令用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。使用该命令时,主选项是必须要有的,辅选项是辅助使用的,可以选用。
主选项包括:

c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。

r 把要存档的文件追加到档案文件的末尾。

t 列出档案文件的内容,查看已经备份了哪些文件。

u 更新文件。用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。

x 从档案文件中释放文件。(常用)

辅选项包括:

f 使用档案文件或设备,这个选项通常是必选的。(常用)

k 保存已经存在的文件。

m 在还原文件时,把所有文件的修改时间设定为现在。

M 创建多卷的档案文件,以便在几个磁盘中存放。

v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。(信息)

w 每一步都要求确认。

z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。(常用)

j 用bzip2来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。(常用)

要将文件备份到一个特定的设备,只需要把设备名作为备份文件名。
打包:

    tar cvf dir.tar dir

    tar xvf dir.tar dir

打gz压缩包:

    tar zcvf dir.tar.gz dir

    tar zxvf dir.tar.gz

打bz2压缩包:

    tar jcvf dir.tar.bz2 dir

    tar jxvf dir.tar.bz2

指定目录解压缩:

    tar zxvf dir.tar.gz –C ~/test

7.2rar

打包:把dir压缩成newdir.rar

    rar a –r newdir dir

解包:把newdir.rar解压缩到当前目录

    unrar x newdir.rar

7.3zip

打包:

    zip –r dir.zip dir

解包:

    unzip dir.zip

8.进程管理

8.1查看当前在线用户

**who **

查看当前在线上的用户情况。所有的选项都是可选的,不使用任何选项时,who命令将显示以下三项内容:

login name:登录用户名;

terminal line:使用终端设备;

login time:登录到系统时间;
Juinjonn@ubuntu:~/demo$ who –uH

名称           线路       时间          空闲        进程号      备注

Juinjonn              tty2      2016-05-12 09:35    .          6798

8.2监控后台进程

ps [选项]
ps命令用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。选项部分如下:

-e 显示所有进程

-f 全格式

-h 不显示标题

-l 长格式

-w 宽输出。

a  显示终端上的所有进程,包括其他用户的进程。

r  只显示正在运行的进程。

x  显示没有控制终端的进程。

这个命令参数有很多,但一般的用户只需掌握一些最常用的命令参数就可以了。最常用的三个参数是u、a、x,我们首先以root身份登录系统,查看当前进程状况。

Juinjonn@ubuntu:~$ ps aux

USER    PID  %CPU  %MEM  VSZ  RSS  TTY   STAT  START  TIME  COMMAND

root      1   0.0     0.0    3672 2008  ?     Ss    08:46  0:01   /sbin/init



Juinjonn@ubuntu:~$ ps ajx

PPID   PID   PGID  SID  TTY    TPGID   STAT  UID  TIME  COMMAND

4592  6948   6948 4592  pts/3   6948   R+   1000  0:00    ps ajx



Juinjonn@ubuntu:~$ ps –Lf  2423

UID  PID  PPID  LWP  C NLMP  STIME  TTY   STAT   TIME  CMD

1000 2423  2282 2423  0   4    08:46    ?     Ssl    0:00  gnome-session—session=ubuntu

1000 2423  2282 2465  0   4    08:46    ?   Ssl    0:00   gnome-session—session=ubuntu

1000 2423  2282 2466  0   4    08:46    ?     Ssl    0:00  gnome-session—session=ubuntu

1000 2423  2282 2468  0   4    08:46    ?     Ssl    0:00  gnome-session—session=ubuntu

Head 标头:

USER 用户名

UID  用户ID(User ID)

PID  进程ID(Process ID)

PPID 父进程的进程ID(Parent Process ID)

SID  会话ID(Session ID)

%CPU 进程的CPU占用率

%MEM 进程的内存占用率

VSZ 进程所使用的虚存的大小(Virtual Size)

RSS 进程使用的驻留集大小或者是实际内存的大小,kbytes字节

TTY 与进程关联的终端(tty)

STAT 进程的状态:进程状态使用字符表示的(STAT的状态码)

R    运行  Runnable(on run queue)      正在运行或在运行队列中等待.

S    睡眠  Sleeping       休眠中,受阻,在等待某个条件的形成或接受到信号

I   空闲  Idle

Z    僵死  Zombie(a defunct process)  进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放。

D   不可中断  Uninterruptible sleep (ususally IO)  收到信号不唤醒和不可运行,进程必须等待直到有中断发生。

T   停止   Terminate      进程收到SIGSTOP ,SIGSTP,SIGTIN,SIGTOU信号后停止运行。

P   等待交换页

W  无驻留页  has no resident pages   没有足够的记忆体分页可分配

X   死掉的进程

<   高优先级进程               高优先序的进程

N   低优先级进程              低优先序的进程

L   内存锁页    Lock         有记忆体分页分配并缩在记忆体内

s   进程的领导者(在它之下有子进程)

l   多进程的(使用 CLONE_THREAD,类似 NPTL pthreads)

+   位于后台的进程组

START  进程启动时间和日期

TIME   进程使用的总CPU时间

COMMAND  正在执行的命令行命令

NI     优先级(Nice)

PRI    进程优先级编号(Priority)

WCHAN 进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。

FLAGS  与进程相关的数字标识。   

8.3显示后台作业

jobs
用来显示当前shell下正在运行哪些作业(即后台作业)。

  cat

(按下ctrl – z 挂起当前进程)

    [1]+ Stopped            cat

    cat

(按下ctrl – z 挂起当前进程)

    [1]+ Stopped            cat

    $ jobs

    [1]- Stopped            cat

    [2]+ Stopped            cat

第一列方括号中的数字表示作业序号,它是由当前运行的shell分配的,而不是由操作系统统一分配的。在当前shell环境下,第一后台作业的作业号为1,第二作业的作业号为2,等等。第二列中的“+”号表示相应作业的优先级比“-”号对应作业的优先级高。第三列表明作业状态,是否为运行、中断、等待输入或停止等。最后列出的是创建当前这个作业所对应的命令行。

8.4后台/挂起作业移到前台运作

fg [job...]

把指定的后台作业或挂起作业移到前台运行。参数job是一个或多个进程的PID,或者是命名名称,或者是作业号(作业号前面要带一个%号)。

通常在shell中输入命令启动进程后,如果该进程需要与用户交互,那么此后用户的键盘输入都被该进程读取,直到该进程退出后才出现shell提示符$,这种进程为前台进程。

如果在命令行的末尾加上&字符,则shell为这个命令创建一个后台进程,它虽然也可以输出到屏幕,但是不能读取键盘输入,不管执行命令的进程有没有退出都立刻回到shell提示符接受下一条命令的输入。如果该进程也需要读取键盘输入,则被挂起等待直到用户用fg命令把它变成前台进程。如果一个命令需要较长的处理时间并且不需要与用户交互,就适合把它放在后台执行。

8.5挂起进程后台执行

把被挂起的进程提到后台执行。其中,job是一个或多个进程的PID、命令名称或者作业号,在参数前要带%号。

    cat

(按下ctrl-z挂起当前进程)

    [1]+ Stopped             cat

    bg %1

    [1]+ cat &

    (再回车一次)

    [1]+ Stopped            cat

    fg %1

    cat

    (按ctrl-d输入文件结束符)

    

8.6进程发送信号

kill
向指定进程发送信号
Kill [-signal | -s signal ] pid…
查看信号编号

    kill –l [signal]

给一个进程发信号,或终止一个进程的运行。

    cat

    (按ctrl-z挂起当前进程)

    [1]+ Stopped                 cat

     ps

        PID     TTY             TIME    CMD

        5819    pts/1         00:00:00   bash

        5893    pts/1          00:00:00   cat

        5894    pts/1          00:00:00   ps

    $kill  -SIGKILL   5893

    $(再次按回车键)

    [1]+ killed               cat

    
Kill命令如果不带参数而直接跟pid,就是发给该进程SIGTERM信号,大部分进程收到该信号就会终止。但是被挂起的进程不能处理信号,所以必须发SIGKILL信号,由系统强制终止进程。

8.7查看当前进程环境变量

env

    env
vim ~/.bashrc

配置当前用户环境变量

vim /etc/profile

配置系统环境变量,配置时需要有root权限。

export PATH=$PATH:新路径

9.用户管理

9.1创建用户

    sudo useradd –s /bin/bash –g Juinjonn –d /home/Juinjonn –m Juinjonn

    sudo useradd –s /bin/sh –g group –G adm,root pzh

此命令新建了一个用户pzh,该用户的登录shell是/bin/sh,他属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

-s 指定新用户登录时shell类型

-g 指定所属组,改组必须已经存在

-G 指定附属组,改组必须已经存在

-g 用户家目录

-m 用户家目录不存在时,自动创建该目录

9.2设置用户组

    sudo groupadd Juinjonn

9.3设置密码

   sudo passwd Juinjonn

9.4切换用户

su 用户名

//Juinjonn是用户名
    su Juinjonn

9.5root用户

变成root用户

    sudo su

设置root密码

    passwd

9.6删除用户

userdel [选项] [用户名]
常用的选项是-r,他的作用是把用户的主目录一起删除。例如:

    sudo userdel –r Juinjonn 
此命令删除用户Juinjonn在系统文件(主要是/etc/passwd,/etc/shadow,/etc/group等)中的记录,同时删除用户的主目录。

10.网络管理

10.1ifconfig

    1.  查看网卡信息             ifconfig
    
    2.  关闭网卡                 sudo ifconfig ens33 down
    
    3.  开启网卡ens33           sudo ifconfig ens33 up
    
    4.  给网卡ens33配置临时IP      sudo ifconfig ens33 IP

10.2ping

ping [选项] 主机名/IP地址
查看网络上的主机是否在工作。它向该主机发送ICMP ECHO_REQUEST包。有时我们想从网络上的某台主机上下载文件,可是又不知道那台主机是否开着,就需要使用ping命令查看。
命令中个选项的含义如下:

-c 数目,在发送指定数目的包后停止。

-d 设定SO_DEBUG的选项

-f 大量且快速的送网络封包给一台机器,看它的回应。

-I 秒数 设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。

-l 次数 在指定次数内,以最快的方式送封包数据到指定机器(只有超级用户可以使用此选项)。

-q 不显示任何传送封包的信息,只显示最后的结果。

-r 不经由网关而直接发送封包到一台机器,通常是查看本机的网络接口是否有问题。

-s 字节数 指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。

10.3netstat

netstat [选项]
显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作。命令中各选项的含义如下:

-a 显示所有socket,包括正在监听的。

-c 每隔1秒就重新显示一遍,直到用户中断它。

-i 显示所有网络接口的信息,格式同“ifconfig -e”。

-n 以网络IP地址代替名称,显示出网络连接情形。

-r 显示核心路由表,格式同“route -e”。

-t 显示TCP协议的连接情况。

-u 显示UDP协议的连接情况。

-v 显示正在进行的工作

10.4nslookup

nslookup name
查询一台机器的IP地址和其对应的域名。它通常需要一台域名服务器来提供域名服务。

如果用户已经设置好域名服务器,就可以用这个命令查看不同主机的IP地址对应的域名。
不带参数使用nslookup命令时,出现提示符“>”,在后面输入要查询的IP地址或域名并回车即可。如果要退出该命令,输入exit并回车即可。

//例如:
Juinjonn@Juinjonn-virtual-machine:~$ nslookup

> www.Juinjonnsot.cn

Server:     127.0.1.1

Address:    127.0.1.1#53

 

Non-authoritative answer:

Name:   www.Juinjonnsot.cn

Address: 202.111.54.183

10.5finger

finger [-lmsp] user [user@host…]
查询用户的信息,通常会显示系统中某个用户的用户名、主目录、停滞时间、登录时间、登录shell等信息。如果要查询远程机上的用户信息,需要在用户名后面接“@主机名”,采用[用户名@主机名]的格式,不过要查询的网络主机需要运行finger守护进程。命令中各选项的含义如下:

-s 显示用户的注册名、实际姓名、终端名称、写烛台、停滞时间、登录时间等信息。

-l 除了用-s选项显示的信息外,还显示用户主目录、登录shell、邮件状态等信息,以及用户主目录下的.plan、.project和.forward文件的内容。

-p 除了不显示.plan文件和.project文件以外,与-1选项相同。

Juinjonn@Juinjonn-virtual-machine:~$ finger Juinjonn

Login: Juinjonn Name: Juinjonn

Directory: /home/Juinjonn Shell: /bin/bash

On since Thu Jun 2 10:28 (CST) on tty7 from :0
6 minutes 56 seconds idle

No mail.

No Plan.

11.常用服务器构建

11.1ftp

11.1.1ftp服务器

  1. 安装vsftpd服务器
sudo apt-get install vsftpd
  1. 配置vsftpd.conf文件
sudo vi /etc/vsftpd.conf

添加下面设置

anonymous_enable=YES

anon_root=/home/colin/ftp

no_anon_password=YES

write_enable=YES

anon_upload_enable=YES

anon_mkdir_write_enable=YES
  1. 重启服务器,重新加载.etc.vsftpd.conf配置文件
sudo /etc/init.d/vsftpd restart
  1. 进入你的/home/colin/ftp目录下创建一个空目录,供用户上传
cd !/ftp

mkdir anonymous

chmod 777 anonymous
  1. 测试上传功能,登录ftp服务器,进入到anonymous目录
ftp IP

cd anonymous
  1. 上传命令,可以把你当前目录下的文件上传到ftp服务器的anonymous目录
put somefile

11.1.2ftp客户端

ubuntu 默认已经安装ftp客户端

11.1.3lftp客户端

lftp也是一种ftp客户程序。它是以文本方式操作的,但是比起图形界面更为方便。Lftp几乎具有bash的所有方便功能,tab补全,bookmark,queue,后台下载等可以得到支持。用法与ftp类似,主要的指令如下:

put 上传文件

mput 上传多个文件

get 下载文件

mget 下载多个文件

mirror 下载整个目录及其子目录

mirror –R 上传整个目录及其子目录

lcommand 调用本地shell执行命令command

注意,有的发行版可能缺省没有安装lftp工具,需要用户自己安装。如果是Debian或Ubuntu系统,则安装lftp软件包。

    sudo apt-get install lftp

11.2nfs

  1. 安装nfs服务器
sudo apt-get install nfs-kernel-server
  1. 设置/etc/exports配置文件
sudo vi /etc/exports

添加这行配置

    /home/用户名/nfs *(rw,sync,no_root_squash)
  1. 在用户目录下创建nfs目录
mkdir /home/用户名/nfs
  1. 重启服务器,重新加载配置文件
sudo /etc/init.d/nfs-kernel-server restart
  1. 在/home/用户名/nfs目录下创建测试文件hello
cd /home/用户名/nfs

touch hello
  1. 测试服务器,把服务器共享目录nfs挂在到/mnt节点
sudo mount –t nfs –o nolock –o tcp IP:/home/用户名/nfs  /mnt
  1. 进入/mnt目录可以看到hello文件,表示构建成功

  2. 卸载网络共享目录

sudo umount /mnt

11.3ssh

  1. 安装ssh服务器
sudo apt-get install openssh-server
  1. 远程登录
ssh 用户名@IP

12其他命令

12.1终端翻页

    shift-pageup

    shift-pagedown

12.2看手册

man
看手册(叫做manual或man page)。每一个命令和系统函数都有自己的man page。\

man man

man read 查看read命令的man page

man 2 read 查看read系统函数的man page(在第二个section中,表示为read(2))

man –k read 以read为关键字查找相关的man page

12.3清屏

clear
清屏。使光标和提示符回到屏幕的第一行。

快捷键:ctrl-l

12.4设置指令别名

alias
alias [-p] name = value...
将value字符串起个别名叫name,以后再命令行输入name,shell自动将其解释为value,如果不带参数执行本命令,或以参数-p执行,则显示当前定义的别名列表。

   $ alias

   alias ls = ‘ls  --color=auto’

   alias rm=’rm -i’

12.5显示文字

echo [-n] 字符串
在显示器上显示一段文字,一般起到一个提示的作用。其中选项n表示输出文字后不换行;字符串可以加引号,也可以不加引号。用echo命令输入加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分隔。
查看上一个程序退出数值,正常情况程序退出值是0

    echo $?

12.6查看当前时间

date

12.7权限掩码

umask

umask [-p] -$ [mode]

umask指定用户创建文件时的掩码,其中的mode和chmod的命令中的格式一样。如果不用mode参数,则显示当前的umask设置。如果用-S参数,则以符号形式显示设置。

$umask

    0022

    $umask –S

    u=rmx,g=rx,o=rx

比如该用户touch或gedit创建一个文件,则其默认权限为-rm-r-r,如果该用户创建一个可执行文件(比如编译生成的程序),则其默认权限为-rwxr-xr-x。也就是说,由于umask的设定,创建的文件默认是不具有g的w权限和o的w权限,除非用chmod更改权限。

12.8创建终端

创建终端标签:Ctrl+Shift+t

切换标签 Alt+n (n=1)

新开终端 ctrl+shift+n

13关机重启

关机重启都需要有root权限

13.1poweroff

13.2 shutdown

shutdown –t 秒数 [-rkncfF] 时间 [警告讯息]

 -t 秒数:设定在切换至不同的runlevel之前,警告和删除二讯号之间的延迟时间(秒)。

 -k :仅送出警告讯息文字,但不是真的要shutdown。

 -r :shutdown之后重新开机。

 -h:shutdown 之后关机。

 -n:不经过init,由shutdown指令本身来做关机动作。(不建议用)

 -f:重新开机时,跳过fsck指令,不检查档案系统。

 -F:重新开机时,强迫做fsck检查。

 -c:将已经正在 shutdown的动作取消。
 

例如:

shutdown –r now 立刻重新开机

shutdown –h now 立刻关机

shutdown –k now ‘Hey| Go away| now ….’  发出警告讯息,但没有真的关机

shutdown –t3 –r now 立刻重新开机,但在警告和删除processes之间,延迟3秒钟。

shutdown –h 10:42 ‘Hey|Go away|’ 10:42分关机.

shutdown –r 10 ‘Hey|Go away |’ 10分钟后关机

shutdown –c 将刚才下的 shutdown指令取消,必须切换至其他tty,登入之后,才能下次一指令。

shutdown now 切换至单人操作模式(不加任何选项时)
注意事项:

时间参数务必要加:不是用now,便是用 hh:mm或mm

now 其实就是0的意思

13.3reboot

13.4查看内核版本信息

    uname -a

13.5查看发行版信息

lsb_release -a

13.6查看空闲内存

free -m

14需要安装的组件

sudo apt-get install openssh-server

sudo apt-get install nfs-kernel-server

sudo apt-get install vsftpd

15gcc

-v / –v / –version 查看gcc版本号 

-I 指定头文件目录,注意-I和之间没有空格 

-c 只编译,生成.o文件,不进行链接 

-g 包含调试信息 -On n=0∼3 编译优化,n越大优化得越多 

-Wall 提示更多警告信息 

-D 编译时定义宏,注意-D和之间没有空格 

-E 生成预处理文件 

-M 生成.c文件与头文件依赖关系以用于Makefile,包括系统库的头文件 

-MM 生成.c文件与头文件依赖关系以用于Makefile,不包括系统库的头文件

16Vim

16.1简介

Vi是“visual interface”的简称,它在linux上的地位就仿佛edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。Vi不是一个排版程序,它不像word或wps那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。Vi没有菜单,只有命令,且命令繁多。

 Vi有三种基本工作模式

    + 命令模式

    + 文本输入模式

    + 末行模式

16.2命令行模式

任何时候,不管用户处于何种模式,只要按一下ESC键,即可使vi进入命令模式;我们在shell环境(提示符为$)下输入启动vi命令,进入编辑器时,也是处于该模式下。在该模式下,用户可以输入各种合法的vi命令,用户管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的vi命令,则vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是vi的合法命令,vi会响铃报警。

16.3末行模式

末行模式也称ex转义模式。在命令模式下,用户按“:”键即可进入末行模式下,此时vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,vi自动回到命令模式。例如:

:sp newfile

列分出一个窗口编辑newfile文件。如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按ESC键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。

16.4Vim基础操作

进入插入模式:

i: 插入光标前一个字符

I: 插入行首

a: 插入光标后一个字符

A: 插入行未

o: 向下新开一行,插入行首

O: 向上新开一行,插入行首

进入命令模式:

ESC:从插入模式或末行模式进入命令模式

移动光标:

h: 左移

j: 下移

k: 上移

l: 右移

M: 光标移动到中间行

L: 光标移动到屏幕最后一行行首

G: 移动到指定行,行号 -G

w: 向后一次移动一个字

b: 向前一次移动一个字

{: 按段移动,上移

}: 按段移动,下移

Ctr-d: 向下翻半屏

Ctr-u: 向上翻半屏

Ctr-f: 向下翻一屏

Ctr-b: 向上翻一屏

gg: 光标移动文件开头

G: 光标移动到文件末尾

删除命令:

x: 删除光标后一个字符,相当于 Del

X: 删除光标前一个字符,相当于 Backspace

dd: 删除光标所在行,n dd 删除指定的行数 

D: 删除光标后本行所有内容,包含光标所在字符

d0: 删除光标前本行所有内容,不包含光标所在字符

dw: 删除光标开始位置的字,包含光标所在字符

撤销命令:

u: 一步一步撤销

U: 一次性撤销当前行所作的所有操作

Ctr-r: 反撤销

重复命令:

.  : 重复上一次操作的命令

文本行移动:

>>: 文本行右移

<<: 文本行左移

复制粘贴:

yy: 复制当前行,n yy 复制 n 行

p: 在光标所在位置向下新开辟一行,粘贴

可视模式:

v: 按字符移动,选中文本

V: 按行移动,选中文本可视模式可以配合 d, y, >>, << 实现对文本块的删除,复制,左右移动

替换操作:

r: 替换当前字符

R: 替换当前行光标后的字符

查找命令:

/: str查找 

n: 下一个 

N:上一个

替换命令: 把abc全部替换成123

:%s/abc/123/g

同上,但要用户一个个确认是否替换

:%s/abc/123/gc

查看 Man Page:

光标移动到函数上,Shift+k 

光标移动到函数上,3 Shift+k,查看第三章的 ManPage

查看宏定义:

[-d: 可以查看宏定义,必须先包含此宏所在的头文件

代码排版:

gg=G: 代码自动缩进排版

vim里执行 shell 下命令:

末行模式里输入!,后面跟命令

16.5 vim分屏操作

分屏操作:

sp: 上下分屏,后可跟文件名

vsp: 左右分屏,后可跟文件名

Ctr+w+w: 在多个窗口切换

启动分屏:
1.使用大写O参数进行垂直分屏

$ vim -On file1 file2 ...

2.使用小写o参数进行水平分屏

$ vim -on file1 file2 ...

注: n是数字,表示分屏的数量,n要大于等于文件个数 

关闭分屏
1.关闭当前窗口

ctrl+w c

2.关闭当前窗口,如果只剩最后一个,则退出vim

ctrl+w q

编辑中分屏
1.上下分割当前打开的文件

ctrl+w s

2.上下分割,并打开一个新的文件

:sp filename

3.左右分割当前打开的文件

ctrl+w v

4.左右分割,并打开一个新的文件

:vsp filename

分屏编辑中光标的移动

vi中的光标键是h,j,k,l,要在各个屏之间切换,只需要先按一下ctrl+w 

1.把光标移动到上边的屏

ctrl+w k

2.把光标移动到下边的屏

ctrl+w j

3.把光标移动到右边的屏

ctrl+w l

4.把光标移动到左边的屏

ctrl+w h

5.把光标移动到下一个的屏

ctrl+w w

移动分屏
1.向上移动

ctrl+w K

2.向下移动

ctrl+w J

3.向右移动

ctrl+w L

4.向左移动

ctrl+w H

屏幕尺寸

1.增加高度

ctrl+w +

2.减少高度

ctrl+w 

3.让所有屏的高度一致

ctrl+w =

4.左加宽度

ctrl+w >

5.右加宽度

ctrl+w <

6.右增加n宽 (如:n=30)

ctrl+w n <

16.6vim打造IDE

vimrc是vim的配置文件,可以修改两个位置

1. /etc/vim/vimrc

2.~/.vimrc

~/.vimrc优先级高

1.拷贝我提供的

    vim.tar.gz, 

2.解包到当前用户目录下

tar zxvf vim.tar.gz -C ~/

3.查看编辑.vimrc文件

vim .vimrc

4.vim常用操作,备注:这些操作可以通过修改.vimrc文件进行设置

17toolchain

binutils 一组用于编译、链接、汇编和其它调试目的的程序,包括ar、as、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip等

* gcc 编译器 

* glibc 该库实现Linux系统函数,例如open、read等,也实现标准C语言库,如printf 等。几乎所有应用程序都需要与glibc链接

本节主要介绍binutils中的几种主要工具的作用。

* ar 打包生成静态库

* as 汇编器 

* ld 链接器。本节前面介绍用gcc完成链接步骤,其实是gcc调用链接器ld,将用户编译 生成的目标文件连同系统的libc启动代码链接在一起形成最终的可执行文件 

* nm 查看目标文件中的符号(全局变量、全局函数等) 

* objcopy 将原目标文件中的内容复制到新的目标文件中,可以通过不同的命令选项调 整目标文件的格式,比如去除某些ELF文件头 

* objdump 用于生成反汇编文件,主要依赖objcopy实现,a.out编译时需要-g, objdump -dSsx a.out > file 

* ranlib 为静态库文件创建索引,相当于ar命令的s选项 

* readelf 解读ELF文件头

18静态库和共享库

*本节就如何创建和使用程序库进行论述。所谓“程序库”,简单说,就是包含了数据和执行码的文件。其不能单独执行,可以作为其它执行程序的一部分来完成某些功能。库的 存在,可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便于升级。程序库可分静态库(static library)和共享库(shared object)。

18.1

是在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分;共享库,是在 执行程序启动时加载到执行程序中,可以被多个执行程序共享使用。

建议库开发人员创建共享库,比较明显的优势在于库是独立的,便于维护和更新;而静 态库的更新比较麻烦,一般不做推荐。然而,它们又各有优点,后面会讲到。

本节所讲述的执行程序和库都采用ELF(Executable and Linking Format)格式,尽管GNU GCC工具可以处理其它格式,但不在本节的讨论范围。

静态库可以认为是一些目标代码的集合。按照习惯,一般以“.a”做为文件后缀名。使 用ar(archiver)命令可以创建静态库。因为共享库有着更大的优势,静态库已经不经常使用。但静态库使用简单,仍有使用的余地,并会一直存在。有些Unix系统,如Solaris 10, 已经基本废弃了静态库。

静态库在应用程序生成时,可以不必再编译,节省再编译时间。但在编译器越来越快的 今天,这一点似乎已不重要。如果其他开发人员要使用你的程序,而你又不想给其源码,提供静态库是一种选择。从理论上讲,应用程序使用了静态库,要比使用动态加载库速度快 1-5%,但实际上可能并非如此。由此看来,除了使用方便外,静态库可能并非一种好的选择。

要创建一个静态库,或要将目标代码加入到已经存在的静态库中,可以使用以下命令:

ar rcs libmylib.a file1.o

file2.o以上表示要把目标码file1.o和file2.o加入到静态库libmylib.a中(ar的参数 r)。若libmylib.a不存在,会自动创建(ar的参数c)。然后更新.a文件的索引,使之包含新 加入的.o文件的内容(ar的参数s)。

静态库创建成功后,需要链接到应用程序中使用。使用gcc的-l选项来指定静态库,使 用-L参数来指定库文件的搜索路径。比如上述例子应指定-lmylib,所有库文件名都以lib开 头,开头的lib在指定参数时应省略。-l和-L之后都直接带参数而不跟空格。

在使用gcc时,要注意其参数的顺序。-l是链接器选项,一定要放在被编译的文件名称 之后;若放在文件名称之前则会连接失败,并会出现莫名其妙的错误。这一点切记。

18.2共享库

共享库的创建比较简单,基本有两步。首先使用-fPIC或-fpic创建目标文件,PIC或 pic表示位置无关代码,然后就可以使用以下格式创建共享库了: gcc -share -Wl,soname,your_soname -o library_name file_list library_list 下面是使用a.c和b.c创建库的示例:

gcc -fPIC -c a.c 

gcc -fPIC -c b.c 

gcc -shared -Wl -o libmyab.so a.o b.o

gcc -shared -Wl,-soname,libmyab.so.1 -o libmyab.so.1.0.1 a.o b.o 

按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker name。真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。

soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序的.dynamic段只记录共享库的soname,只要soname一致,这个 共享库就可以用。如libmyab.so.1和libmyab.so.2是两个主版本号不同的libmyab,有些应 用程序依赖于libmyab.so.1,有些应用程序依赖于libmyab.so.2,但对于依赖libmyab.so.1 的应用程序来说,真正的库文件不管是libmyab.so.1.10还是libmyab.so.1.11都可以用,所 以使用共享库可以很方便地升级库文件而不需要重新编译应用程序,这是静态库所没有的优点。注意libc的版本编号有一点特殊,libc-2.8.90.so的主版本号是6而不是2或2.8。

linker name仅在编译链接时使用,gcc的-L选项应该指定linker name所在的目录。有 的linker name是库文件的一个符号链接,有的linker name是一段链接脚本。例如上面的 libc.so就是一个linker name,它是一段链接脚本:

18.3 共享库加载

在所有基于GNUglibc的系统中,在启动一个ELF二进制执行程序时,一个特殊的 程序“程序装载器”会被自动装载并运行。在linux中,这个程序装载器就是/lib/ldlinux.so.X(X是版本号)。它会查找并装载应用程序所依赖的所有共享库。被搜索的目录保

存在/etc/ld.so.conf文件中。当然,如果程序的每次启动,都要去搜索一番,势必效率不 堪忍受。Linux系统已经考虑这一点,对共享库采用了缓存管理。ldconfig就是实现这一功能的工具,其缺省读取/etc/ld.so.conf文件,对所有共享库按照一定规范建立符号连接, 然后将信息写入/etc/ld.so.cache。 /etc/ld.so.cache的存在大大加快了程序的启动速度。

1. 修改/etc/ld.so.conf

sudo vi /etc/ld.so.conf

添加你的共享库路径

2. 更新查找共享库的路径

sudo ldconfig -v

3.测试你的程序可否找到共享库

ldd a.out
上一篇下一篇

猜你喜欢

热点阅读