标签: Linux
1. 库
库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。
a. 静态库
之所以称为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。首先,静态库对函数库的链接是放在编译时期完成的。其次,程序在运行时与函数库再无瓜葛,移植方便。静态库也有缺点如下图所示,造成空间内存浪费;
b. 动态库
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
2. LIBRARY_PATH和LD_LIBRARY_PATH环境变量
- LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径。
- LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,
3. Linux的根文件系统
/bin
和/usr/bin
该目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要的linux命令和二进制(可执行)文件,包含shell解释器等。
/boot
该目录中存放系统的内核文件和引导装载程序文件,/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。
/dev
存放设备文件的目录,存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,存放连接到计算机上的设备(终端、磁盘驱动器、光驱及网卡等)的对应文件,包括字符设备和块设备等,常用的是挂载光驱mount /dev/cdrom/mnt。
/etc
存放系统管理和配置文件的目录,系统配置文件存放的目录,该目录存放系统的大部分配置文件和子目录。重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11(X Window系统有关)、/etc/sysconfig(与网络有关)、/etc/xinetd.d修改配置文件之前记得备份。该目录下的文件由系统管理员来使用,普通用户对大部分文件有只读权限。
/home
用户主目录,比如用户user的主目录就是/home/user,可以用~user表示
/lib
、/usr/lib
和/usr/local/lib
存放动态链接共享库的目录
/sbin
,/usr/sbin
和/usr/local/sbin
放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。
/tmp
一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
/root
系统管理员的主目录
/mnt
系统提供这个目录是让用户临时挂载其他的文件系统。关于挂载的理解:
linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构;这里所说“按一定方式”就是指的挂载,
通俗的说,将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载;我们把这个子目录叫“挂载点”不同的是WINDOWS是把分区映射到一个盘符,而LINUX下是映射到一个目录。
/proc
此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,
/var
如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运作后才会渐渐占用硬盘容量的目录。 放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log。
/usr
(最庞大的目录,要用到的应用程序和文件几乎都在这个目录),它不是user的缩写,其实usr是Unix Software Resource的缩写,也就是Unix操作系统软件资源所放置的目录,都会放置到/usr底下,因此这个目录有点类似Windows系统的C:\Windows + C:\Program files\这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。
/usr/bin/ #绝大部分的用户可使用指令都放在这里
/usr/lib/ #应用软件的函式库、目标文件(object file),以及不被一般使用者惯用的执行档或脚本(script)。 某些软件会提供一些特殊的指令来进行服务器的设定,这些指令也不会经常被系统管理员操作, 那就会被摆放到这个目录下啦。要注意的是,如果你使用的是X86_64的Linux系统, 那可能会有/usr/lib64/目录产生
/usr/local/ #本地安装的软件和其他文件放在这里,/usr/local/bin存放本地增加的命令,/usr/local/include存放本地增加的库文件。
4. 不同用户使用不同版本gcc(5.3)的方法
- 安装gcc需要GMP、MPFR、MPC这三个库,由于MPFR依赖GMP,而MPC依赖GMP和MPFR,所以要先安装GMP,其次MPFR,最后才是MPC(下载地址) .将他们解压后放在一个文件夹下。
安装gmp4.3.2
进入gmp4.3.2的安装目录执行。(注意:prefix指定编译的时候用来指定程序存放路径 。)./configure --prefix=/home/gqx/new_gcc/gmp-4.3.2 make make install
安装mpfr2.4.2
进入gmp4.3.2的安装目录执行(注意:配置的时候要把依赖关系选项加进去)./configure --prefix=/home/gqx/new_gcc/mpfr-2.4.2 --with-gmp=/home/gqx/new_gcc/gmp-4.3.2 make make install
安装mpc0.8.1
进入安装目录./configure --prefix=/home/gqx/new_gcc/mpc-0.8.1 --with-gmp=/home/gqx/new_gcc/gmp-4.3.2 --with-mpfr=/home/gqx/new_gcc/mpfr-2.4.2 make make install
添加环境变量
修改~/.bashrc
文件,添加如下内容:LD_LIBRARY_PATH=LD_LIBRARY_PATH:=/home/gqx/new_gcc/mpc-0.8.1/lib:/home/gqx/new_gcc/gmp-4.3.2/lib:/home/gqx/new_gcc/mpfr-2.4.2/lib:/home/gqx/new_gcc/gcc-5.3/lib export D_LIBRARY_PATH
安装gcc
下载gcc-5.3安装包
gcc各版本浏览地址:http://ftp.gnu.org/gnu/gcc/
gcc-5.3下载地址:http://ftp.gnu.org/gnu/gcc/gcc-5.3/gcc-5.3.tar.bz2
进入安装目录,编译安装指令如下:./configure --prefix/home/gqx/new_gcc/gcc-5.3/ --with-gmp=/home/gqx/new_gcc/gmp-4.3.2 --with-mpfr=/home/gqx/new_gcc/mpfr-2.4.2 --with-mpc=/home/gqx/new_gcc/mpc-0.8.1
可能会出现如下问题
checking for default BUILD_CONFIG... bootstrap-debug checking for --enable-vtable-verify... no /usr/bin/ld: crt1.o: No such file: No such file or directory collect2: ld returned 1 exit status
则需要运行如下命令:
#centos sudo yum install glibc-devel.i686 sudo yum install libgcc.i686 #ubuntu sudo apt-get install gcc-multilib
该过程需要一部分时间,接下来,编译
make make insatll
建立一个bin目录,做好软链接
查看软链接是否成功:mkdir bin ln -s /home/gqx/new_gcc/gcc-5.3/bin/gcc ./bin/gcc ln -s /home/gqx/new_gcc/gcc-5.3/bin/g++ ./bin/g++
ls ./bin -l
;注意,这里的bin目录是在/home/
目录下建的。添加环境变量
修改~/.bashrc
文件,添加如下内容:export PATH=$PATH:~/bin #CC:用来指定C编译器 export CC=/home/gqx/new_gcc/gcc-5.3/bin/gcc #CXX: 用来制定CXX编译器 export CXX=/home/gqx/new_gcc/gcc-5.3/bin/g++ export C_INCLUDE_PATH=/home/gqx/gcc/gcc-5.3/include:$C_INCLUDE_PATH export LD_LIBRARY_PATH=/home/gqx/gcc/gcc-5.3/lib64:/home/gqx/gcc/gmp-4.3.2/lib:/home/gqx/gcc/mpfr-2.4.2/lib:/home/gqx/gcc/mpc-0.8.1/lib:$LD_LIBRARY_PATH
保存生效后,查看即可。
gcc -v
5. GNU、GCC与G++的区别
- GNU
GNU不是一个公司名,而是一个软件项目名。它开发了许多应用程序。
- GCC
GCC全称是 GNU C Compiler, 最早的时候就是一个c编译器。但是后来因为这个项目里边集成了更多其他不同语言的编译器,GCC就代表 the GNU Compiler Collection,所以表示一堆编译器的合集。
- G++
G++则是GCC的c++编译器
6. configure和make
configure
这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:
上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。./configure --prefix=/usr
同时一些软件的配置文件你可以通过指定--sys-config=
参数进行设定。有一些软件还可以加上--with、--enable、--without、--disable
等等参数对编译加以控制,你可以通过允许./configure --help
察看详细的说明帮助。make
make 的作用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。
7.管道命令
管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)
管道命令使用|
作为界定符号,管道命令与上面说的连续执行命令不一样。如下案例:
command1 | command2 | command3;
常用的管道命令如下:
选取命令:cut
cut -d '分隔字符' -f field // 用于分隔字符 cut -c 字符范围 [参数说明] -d : 后面接分隔字符,通常与 -f 一起使用 -f : 根据-d 将信息分隔成数段,-f 后接数字 表示取出第几段 -c : 以字符为单位取出固定字符区间的信息
grep
分析一行信息,如果其中有我们需要的信息,就将该行拿出来grep [-acinv] [--color=auto] '查找字符串' filename [参数说明] -a : 将binary文件以text文件的方式查找数据 -c : 计算找到 '查找字符串'的次数 -i : 忽略大小写的不同 -n : 输出行号 -v : 反向选择,显示没有查找内容的行 --color=auto : 将找到的关键字部分加上颜色显示
排序命令sort,wc,uniq
sort [-fbMnrtuk] [file or stdin] [参数说明] -f :忽略大小写的差异,例如A 与a 视为编码相同 -b :忽略最前面的空格部分 -M :以月份的名字来排序,例如JAN, DEC 等等的排序方法 -n :使用『纯数字』进行排序默认是以文字型态来排序的) -r :反向排序 -u :就是uniq ,相同的资料中,仅出现一行代表 -t :分隔符号,预设是用[tab] 键来分隔 -k :以那个区间(field) 来进行排序的意思 uniq [-ic] [参数说明] -i :忽略大小写的不同 -c :进行计数 wc [-lwm] [参数说明] -l :仅列出行 -w :仅列出多少字(英文单字) -m :多少字符
利用管道命令可以帮助解决很多问题,常用的一条命令是根据进程名字删除杀死进程,如下:
#杀死名为routerserver的进程 ps aux|grep routerserver|grep -v grep | awk '{print $2}'|xargs kill -9
关于
ps
相关参数的说明:-a 显示现行终端机下的所有进程,包括其他用户的进程。 -u 以用户为主的格式来显示程序状况 -x 显示所有程序,不以终端机来区分。
还有就是根据端口号杀死进程:
netstat -tunlp|grep 端口号 #获取进程号 kill -9 进程号
关于netstat的参数说明:
-t或--tcp:显示TCP传输协议的连线状况; -u或--udp:显示UDP传输协议的连线状况; -n或--numeric:直接使用ip地址,而不通过域名服务器; -l或--listening:显示监控中的服务器的Socket; -p或--programs:显示正在使用Socket的程序识别码和程序名称;
8. 链接
目标文件有三种类型:
可重定位的目标文件:包含二进制数据和代码,其形式可以在编译时与其他可重定位合并起来,创建一个可执行的目标文件
可执行的目标文件:包含二进制和代码,可以直接复制到内存并执行
共享目标文件:一类特殊的可重定位目标文件,可以在加载或者运行时被动态的加载到内存执行。
上面提到的三种对象文件有统一的格式(ELF文件),包含几个重要的部分,如下图:
下面分别介绍一下主要部分:
.text section
代码部分
.rodata section
只读数据部分,例如跳转表
.data section
初始化的全局变量
.bss section
未初始化的全局变量
.symtab section
包含 symbol table, procudure 和 static variable names 以及 section names 和 location
.rel.txt section
.text section 的重定位信息
.rel.data section
.data section 的重定位信息
链接器实际上会处理三种不同的符号,对应于代码中不同写法的部分:
全局符号 Global symbols
在当前模块中定义,且可以被其他代码引用的符号,例如非静态 C 函数和非静态全局变量。
外部符号 External symbols
同样是全局符号,但是是在其他模块(也就是其他的源代码)中定义的,但是可以在当前模块中引用。
本地符号 Local symbols
在当前模块中定义,只能被当前模块引用的符号,例如静态函数和静态全局变量。
注意,Local linker symbol 并不是 local program variables
链接过程
第一步 符号解析 Symbol resolution
符号解析会将每个符号引用刚好和一个符号定义联系起来。汇编器生成可重定位目标文件后,内部符号都已被正确地符号解析, 外部符号可能会引用了非本模块的符号定义,汇编器无法找到符号定义,因此无法解析。 汇编器把外部符号放入”符号表“.symtab,同时把如何解析该符号的方法放入”重定位表“。链接器只知道非静态的全局变量/函数,而对于局部变量一无所知,局部非静态变量和局部静态变量的区别:
局部非静态变量会保存在栈中
局部静态变量会保存在 .bss 或 .data 中
链接器符号解析时会用到符号表:
强符号与弱符号: 函数和初始化的全局变量叫强符号, 未初始化的全局变量叫弱符号。(extern int a是一个弱符号定义, int a 也是弱符号)
符号解析规则:
1.(定义多个强符号) 当引用符号时,该符号的符号定义有不止一个强符号定义时,会出现符号重定义错误。
2.(定义一个强符号和一个或者多个弱符号)当引用符号时, 该符号的符号定义有个强符号定义和一个和多个弱符号定义, 使用强符号定义。
3.(定义多个弱符号)当引用符号时, 该符号的符号定义都是弱符号时, 选择任意一个定义。
第二步 重定位 Relocation
就是把不同可重定位对象文件拼成可执行对象文件,有三步,如下:
1.合并可重定位目标文件中相同的节。
2.重定位节和符号定义,修改符号表。为节和符号定义分配虚拟地址。修改符号表中符号定义的值为刚分配的虚拟地址。
3.重定位节中的符号引用,修改代码段和数据段符号引用。使用重定位表.rel.text .rel.data, 修改text,data中符号引用的地址。
例如下图,多个可重定位对象文件合并成可执行文件的过程所示:
简述为, 合并节, 重定位符号定义(修改符号表),重定位符号引用(修改数据段代码段)。
更多的详细内容可以参考该文章中的PPT:符号及符号解析
处理目标文件的一些工具,如下:
AR :创建静态库,插入、删除、列出和提取成员。
NM :列出一个目标文件的符号表中定义的符号。
LDD :列出一个可执行程序文件在运行时所需的共享库。
9. linux中gdb的使用
a. 断点
在代码的指定位置中断,使程序在此中断。
break 在进入指定函数时停住
break 在指定行号停住。
break +/-offset 在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum 在源文件filename的linenum行处停住。
break ... if ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
b. 查看变量
最常用的查看变量的方法是
(gdb) print {变量名}
如果打印数组,由于默认的设置,可能打印的数组尾部部分没有显示,可以通过如下的命令设置打印数组的最大长度
(gdb) set print elements 300
c. 调试中查看代码
list function 如list main:显示main函数附近的代码
list file:function 如list main.c:main:显示main.c中的main函数附近的代码
list n1,n2 如list 10,20,显示当前文件的10到20行
也可以用如下命令:
gdb -tui 项目名
或者在启动gdb后, 输入命令focus。
d. 恢复程序运行和单步调试
在gdb中,和调试步进相关的命令主要有如下几条:
continue 继续运行程序直到下一个断点(类似于VS里的F5)
next 逐过程步进,不会进入子函数(类似VS里的F10)
step 逐语句步进,会进入子函数(类似VS里的F11)
until 运行至当前语句块结束
finish 运行至函数结束并跳出,并打印函数的返回值(类似VS的Shift+F11)
e. GDB backtrace bt 查看程序crash堆栈信息
当程序被停住了,需要做的第一件事就是查看程序是在哪里停住的。当你程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。可以用bt命令来查看当前的栈中的信息。
10. 解压和压缩命令
a. tar
tar 包文件的命令通常都是以 .tar 结尾的。生成 tar 包后,就可以用其它的程序来进行压缩了,例如:
tar -cf all.tar *.jpg #将所有 .jpg 的文件打成一个名为 all.tar 的包。-c 是表示产生新的包,-f 指定包的文件名。
tar -rf all.tar *.gif #将所有 .gif 的文件增加到 all.tar 的包里面去,-r 是表示增加文件的意思。
关于后缀的说明:
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
(1). 调用gzip
gzip 是 GNU 组织开发的一个压缩程序,.gz 结尾的文件就是 gzip 压缩的结果。与 gzip 相对的解压程序是 gunzip。tar 中使用 -z 这个参数来调用gzip。
tar -czf all.tar.gz *.jpg #将所有 .jpg 的文件打成一个
(2). tar 调用 bzip2
.bz2 结尾的文件就是 bzip2 压缩的结果。与 bzip2 相对的解压程序是 bunzip2。tar 中使用 -j 这个参数来调用 gzip
tar -cjf all.tar.bz2 *.jpg #将所有 .jpg 的文件打成一个 tar 包,并且将其用 bzip2 压缩,生成一个 bzip2 压缩过的包,包名为 all.tar.bz2
相应的解压命令如下:
tar -xjf all.tar.bz2
(3). 对于zip
zip 是压缩程序,unzip 是解压程序。
zip all.zip *.jpg
unzip all.zip
(4). 总结
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压
11. Linux软链接硬链接的区别
ln功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
必要参数:
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
软连接
命令:
ln -s 原文件 目标文件
特征:
1.相当于windows的快捷方式
2.只是一个符号连接,所以软连接文件大小都很小
3.当运行软连接的时候,会根据连接指向找到真正的文件,然后执行
4.所有软连接文件的权限是777,而真正的权限是由指向的那个文件决定的
5.原文件丢失,软连接无法访问,会报找不到的错误
6.ls -al以后,软连接后面箭头指向的是原文件
硬连接
命令:
ln 原文件 目标文件
特征:
1.原文件和连接文件的属性完全一样
2.连接文件和原文件的关系类似于:复制+同步更新
3.当原文件丢失,硬连接文件还可以访问
4.不能跨分区,不能针对目录使用
5.原文件和硬链接文件的i节点号是相同的(ls -i),1个文件名对应一个i节点,1个i节点可以通过多个文件名访问,所以,他们的属性完全相同,并且修改了其中一个的内容另一个也会跟着修改
补充:
Linux 目前使用的是 ext4 文件系统。如果用一张示意图来描述 ext4 文件系统,则可以如下图。
ext4 文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的 inode (i 节点)信息;剩余的大部分用于保存 block 信息。
inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。大家如果仔细查看,就会发现 inode 中是不记录文件名的,那是因为文件名记录在文件所在目录的 block 中。
block 的大小可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。
12. 软件安装
a. 使用tar打包的应用软件
b. 使用rpm打包的应用软件
安装
只需简单的一句话语句去执行:
rpm –ivh rpm软件包名
更高级的,请见下表:
rpm参数 参数说明
-i 安装软件
-t 测试安装,不是真的安装
-p 显示安装进度
-f 忽略任何错误
-U 升级安装
-v 检测套件是否正确安装
...
卸载:
同样只需执行:
rpm –e 软件名
不过要注意的是,后面使用的是软件名,而不是软件包名。例如,要安装software-1.2.3-1.i386.rpm这个包时,应执行:
rpm –ivh software-1.2.3-1.i386.rpm
而当卸载时,则应执行:
rpm –e software
*** c.使用deb打包的应用程序 ***
安装
dpkg –i deb软件包名
如:dpkg –i software-1.2.3-1.deb
卸载:
dpkg –e 软件名
如:dpkg –e software
一般来说著名的linux系统基本上分两大类:
RedHat系列:Redhat、Centos、Fedora等
Debian系列:Debian、Ubuntu等
Debian系列
常见的安装包格式 deb包,安装deb包的命令是“dpkg -参数”
包管理工具 apt-get
apt-get可以用于运作deb包,例如在Ubuntu系统上对某个软件的管理:
安装:apt-get install
卸载:apt-get remove
更新:apt-get update
支持tar包
yum可以用于运作rpm包
安装:yum install
卸载:yum remove
更新:yum update
13. 环境变量的设置
Linux下环境变量设置的三种方法:
只对当前的shell 起作用的环境变量
在shell的命令行下直接使用export 变量名=变量值
定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。- 对单一用户生效(永久的)
用VI在用户目录下的~/.bashrc
文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。修改文件后要想马上生效还要运行source ~/.bashrc
不然只能在下次重进此用户时生效。 对所有用户生效(永久的)
用VI在文件/etc/profile
文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。注:修改文件后要想马上生效还要运行source /etc/profile
。不然只能在下次重进此用户时生效。
14. Makefile.am相关
Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候,就将Makefile.in文件自动生成Makefile文件了。所以Makefile.am文件是比Makefile文件更高的抽象。
用如下Makefile.am文件为例作说明:
AUTOMAKE_OPTIONS=foreign subdir-objects
bin_PROGRAMS = client
client_SOURCES = key.c connect.c client.c main.c session.c hash.c
client_CPPFLAGS = -DCONFIG_DIR=\"$(sysconfdir)\" -DLIBRARY_DIR=\"$(pkglibdir)\"
client_LDFLAGS = -export-dynamic -lmemcached
noinst_HEADERS = client.h
INCLUDES = -I/usr/local/libmemcached/include/
client_LDADD = $(top_builddir)/sx/libsession.la \
$(top_builddir)/util/libutil.la
AUTOMAKE_OPTIONS:这个是用来设定automake的选项。automake主要是帮助开发GNU软件的人员维护软件套件,一般在执行automake时会检查目录下是否存在标准GNU套件中应具备的文件档案,例如NEWS、AUTHOR、ChangeLog等,设成foreign时,automake会改用一般软件套件标准来检查,而gnu是缺省设置,该级别下将尽可能地检查包是否服从GNU标准,gnits是严格标准,不推荐。
bin_PROGRAMS:表示指定要生成的可执行应用程序文件,这表示可执行文件在安装时需要被安装到系统中,如果只是想编译。不想被安装到系统中,可以用noinst_PROGRAMS来代替。
bin_PROGRAMS=client这一行表示什么意思?解释如下:
PROGRAMS 知道这是一个可执行文件。
client 表示编译的目标文件。
bin表示目录文件被安装到系统的目录。
client_SOURCES:表示生成可执行应用程序所用的源文件,这里注意,client_是由前面的bin_PROGRAMS指定的,如果前面是生成example,那么这里就是example_SOURCES,其它的类似标识也是一样。
client_CPPFLAGS:这和Makefile文件中一样,表示C语言预处理器参数,这里指定了DCONFIG_DIR,以后在程序中,就可以直接使用CONFIG_DIR,不要把这个和另一个CFLAGS混淆,后者表示编译器参数。
client_LDFLAGS:这个表示在连接时所需要的库文件选项标识。这个也就是对应一些如-l,-shared等选项。
INCLUDES:连接时所需要的头文件。
15. 网络服务
a. 服务的管理
管理命令 | 命令 | 含义 |
---|---|---|
service 服务名 | start | 启动服务 |
service 服务名 | stop | 停止服务 |
service 服务名 | restart | 重新启动服务 |
举例说明
/etc/init.d/服务名 start #启动服务
/etc/init.d/服务名 stop #停止服务
/etc/init.d/服务名 restart #重新启动服务
/etc/init.d/network restart #重启network服务,读入配置文件
b. 用ifconfig查看设备信息
eth0 Link encap:Ethernet HWaddr 00:0C:29:7A:E4:0E
inet addr:192.168.1.110 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe7a:e40e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1709 errors:0 dropped:0 overruns:0 frame:0
TX packets:783 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:175347 (171.2 KiB) TX bytes:100454 (98.0 KiB)
Interrupt:19 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
...
eth0 表示第一块网卡, 其中 HWaddr 表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址)是 00:0C:29:7A:E4:0E
inet addr 用来表示网卡的IP地址,此网卡的 IP地址是 192.168.1.110,广播地址Bcast:192.168.1.255 ,掩码地址Mask:255.255.255.0 。
lo 是表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 HTTPD服务器的指定到回坏地址,在浏览器输入 127.0.0.1 就能看到你所架WEB网站了。但只是您能看得到,局域网的其它主机或用户无从知道。
第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)
第二行:网卡的IP地址、子网、掩码
第三行:UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节 。
第四、五行:接收、发送数据包情况统计
第七行:接收、发送数据字节数统计信息。
c. Linux网络服务管理命令
查看指定的服务是否开启
netstat | grep ssh | grep -v grep
telnet协议是TCP/IP协议簇中的一员,是Intenet远程登录服务的标准协议
#示例1:登录远程主机192.168.78.20
telnet 192.168.78.20
#示例2:以帐户hadoop远程登录主机192.168.78.20
telnet -l hadoop 192.168.78.20
#示例3:登录远程主机bbs.uestc.edu.cn
telnet bbs.uestc.edu.cn
文件传输命令
FTP文件传送协议是一个用于从一台主机到另一台主机传送协议。
#利用登录账户登录到FTP服务器
ftp 192.168.16.1
登录成功后可以进行一些操作
下载一个文件:get 文件名 指定目录
删除一个文件:delete 文件名
上传一个文件:put 文件名
安全的主机间复制文件——scp
scp [email protected]:./test test 保存地址
16. 磁盘管理
a. Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。
gqx@gqx-Lenovo-Product:~$ df -lh
# -h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...)
# -l, --local 限制列出的文件结构
文件系统 容量 已用 可用 已用% 挂载点
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 34M 1.6G 3% /run
/dev/sda3 74G 11G 60G 15% /
tmpfs 7.9G 2.7G 5.2G 35% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/sda8 360M 210M 128M 63% /boot
/dev/sda4 122G 40G 76G 35% /home
tmpfs 1.6G 96K 1.6G 1% /run/user/1000
从上信息可以看出系统安装在/dev/sda3
上,挂载在/home
目录下的磁盘分区/dev/sda4
大小是122G。
b. Linux du命令是显示每个文件和目录的磁盘使用空间。但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看。
-a或-all 显示目录中个别文件的大小。
-s或--summarize 仅显示总计,只列出最后加总的值。
-h或--human-readable 以K,M,G为单位,提高信息的可读性。
17. 后续补充
引用链接:
- 多用户使用不同的gcc
- gcc安装
- 静态库与动态库的区别
- linux管道流命令
- Linux编程基础——GDB(设置断点)
- Linux tar.gz、tar、bz2、zip 等解压缩、压缩命令详解
- Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版
- 不周山之读薄 CSAPP
- 符号及符号解析
- Makefile.am文件配置
- Linux文件目录结构详解
- linux系统网络服务命令