Linux 2 系统编程
Linux系统编程 2
1.压缩解压缩管理
(1).tar 将文件 或者文件夹进行归档
tar [选项] 打包文件名 文件
tar -cvf 创建归档文件
tar -xvf 解除归档文件(还原)
tar -tvf 查看归档文件内容
sudo tar -cvf test.tar file2 file4 file5
ls
file2 file4 file5 test.tar
(2).gzip 文件压缩工具 不支持文件夹
由于特性 故此经常先归档再压缩
sudo gzip test.tar
ls
file2 file4 file5 test.tar.gz
tar指令 实现压缩加归档
ls
test.tar.gz
sudo tar zxvf test.tar.gz // 解缩
ls
file2 file4 file5 test.tar.gz
sudo rm test.tar.gz//删除归档
ls
file2 file4 file5
sudo tar -vczf test.tar.gz file2 file4 file5//快捷归档压缩
ls
file2 file4 file5 test.tar.gz
(3).bzip2
令一种压缩方式
在tar命令中增加一个选项(-j)可以调用bzip2实现了一个压缩的功能,实行一个先打包后压缩的过程。
简单用法
sudo bzip2 file2 压缩
sudo bzip2 -d file2.bz2 解压
压缩用法:tar jcvf 压缩包包名 文件...(tar jcvf bk.tar.bz2 *.c)
sudo tar jcvf mm.test.tar.bz2 file2
解压用法:tar jxvf 压缩包包名 (tar jxvf bk.tar.bz2)
sudo tar jxvf mm.test.tar.bz2
(4).1.zip和un zip
需要压缩的文件不需要指定压缩名字 压缩名字 zip -r 目标文件 源文件
解压文件 unzip -d 解压后目录文件 压缩文件
sudo zip mya file2 file4 file5
sudo unzip mya.zip
2.文件权限管理
(1).linux用户分类
所有者 创建文件的用户
用户组 某一类组
其他用户 公告用户权限
(2).访问权限说明
读 r 写 w 可执行 x
(3).chmod 修改文件权限
字母法修改权限
sudo chmod o+wx rsyslogd.pid ///更改其他组为 读写
-rw-r--rwx 1 root root 3 6月 7 09:02 rsyslogd.pid
sudo chmod u-w rsyslogd.pid//撤销所有者写权限
-r--r--rwx 1 root root 3 6月 7 09:02 rsyslogd.pid
sudo chmod g=x rsyslogd.pid//更改用户组为 读写
-r----xrwx 1 root root 3 6月 7 09:02 rsyslogd.pid
数字法修改权限
(4).chown 与chgrp 权限管理
chown 修改文件所属者
-rw-rw-r-- 1 root utmp 1152 6月 7 09:03 utmp
sudo chown utmp utmp//文件所属者
-rw-rw-r-- 1 utmp utmp 1152 6月 7 09:03 utmp
sudo chown :root utmp//文件所属组
-rw-rw-r-- 1 utmp root 1152 6月 7 09:03 utmp
3.软件包安装
在线安装 卸载 ls
sudo apt-get install sl
sudo apt-get remove sl
软件包本地安装
tree软件安装
deng@itcast:~$ sudo dpkg -i tree_1.6.0-1_amd64.deb
tree软件卸载
deng@itcast:~$ sudo dpkg -r tree
4.重定向
比如ls显示到屏幕的数据重定向到文件中
重定向文件-屏幕输出到文件
ls /etc/passwd > file1 //文件重定向
cat file1
//内容->/etc/passwd
sudo ls /etc/passwd >>file1 //文件内容重定向追加输入
//内容->/etc/passwd /etc/passwd
//重定向标准错误输出
wwww 2>> file1
//重定向黑洞
ls dafsd 2> /dev/null
5.其他命令
(1).tree
tree 以树状形式查看指定目录内容,使用该命令需要安装软件 tree:
sudo apt install tree
(2).ln
创建链接文件
软链接->快捷方式
硬链接->两个文件名同时指向一块磁盘区域(硬链接】 不受位置影响
无s是硬链接 有-s软链接
软链接:ln -s file1 testfile2
硬链接:ln file1 testfile1
6. geit编辑器
(1).vim编译器的三种模式
命令模式 -> [i] 编辑模式 ->esc ->命令模式
命令模式-> [:] 末行模式 ->回车
保存文件 shift zz
7.1 命令模式下的操作
(省)
7.GCC编译器
(1).gcc简介
linux 官方编译器 能编译多门语言
格式 gcc [ 可选选项] file
man gcc
c->预处理->编译->汇编.S->链接生成可执行文件
(2).GCC 工作流程和使用
c->i->s->o
分步生成可执行文件
gcc -E test.c -o testm.i.//生成预处理
gcc -S testm.i -o tstemm.s//汇编文件
gcc -c tstemm.s -o testtt.o//二进制文件
gcc testtt.o -o mmm//可执行文件
./mmm
一步到位
gcc test.c -o kzxwj
(3).gcc常用选项
gcc常用选项
| 选项 | 作用 |
|---|---|
| -o file | 指定生成的输出文件名为file |
| -E | 只进行预处理 |
| -S(大写) | 只进行预处理和编译 |
| -c(小写) | 只进行预处理、编译和汇编 |
| -v / --version | 查看gcc版本号 |
| -g | 包含调试信息 |
| -On n=0~3 | 编译优化,n越大优化得越多 |
| -Wall | 提示更多警告信息 |
| -D | 编译时定义宏 |
显示所有的警告信息
gcc -Wall test.c
将警告信息当做错误处理
gcc -Wall -Werror test.c
(4).静态链接和动态链接
1.静态链接
由链接器在链接时将库内容加入可执行文件
2.动态链接
在链接时 将所需库函数建立关系
依赖动态库
3.静态 动态 编译对比
1.动态编译
gcc test.c -o testshare
2.静态编译
gcc -static test.c -o teststatic
大小对比
ls -ln testshare teststatic
-rwxrwxr-x 1 1000 1000 8304 6月 9 08:18 testshare
-rwxrwxr-x 1 1000 1000 845272 6月 9 08:18 teststatic
(5).静态库 与动态库
(1)静态库的制作
环境 生成 4个.c h 文件 分别有 加减乘除
写一个主文件 包含四个头文件
多文件编译
名字: 前 libxxx.a 后
将打包好的.o文件生成静态库
sudo gcc -c mul.c -o mul.o
ar- [r c s] 名字 静态库
ar -rcs libtest.a mul.o sub.o add.o
r更新
c创建
s建立索引
(2).静态库的使用
gcc mun.c -L./ -I./ -ltest -o test
-L:表示要连接的库所在目录
-I./: I(大写i) 表示指定头文件的目录为当前目录
-l(小写L):指定链接时需要的库,去掉前缀和后缀
(3).动态库的制作
name: libxxx.so
三步
//生成目标文件(与地址无关的编译程序)
gcc -fPIC -c add.c
//生成共享库
gcc -shared add.o sub.o mul.o -o libqtest.so
//nm查看对应函数
nm libtest.so | grep add
命令选项参数与空格分隔
(4).动态库使用
三种方法
1.生成法
gcc mun.c -L. -I. -ltest
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统动态载入器(dynamic linker/loader)。
对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段 — 环境变量LD_LIBRARY_PATH — /etc/ld.so.cache文件列表 — /lib/, /usr/lib目录找到库文件后将其载入内存。
//1.临时设置路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:libqtest.so
//2.永久设置
//永久设置,把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径,设置到~/.bashrc或者 /etc/profile文件中
vim ~/.bashrc
最后一行添加如下内容:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
使环境变量生效
source ~/.bashrc
//3.使用符号链接, 但是一定要使用绝对路径
sudo ln -s /home/as/文档/test/as/libqtest.so /lib/libqtest.so//将lib文件创建一个到ls中
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/as/文档/test/as/libqtest.so
8.GDB调试器
GDB主要帮忙你完成下面四个方面的功能:
-
启动程序,可以按照你的自定义的要求随心所欲的运行程序。
-
可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
-
当程序被停住时,可以检查此时你的程序中所发生的事。
-
动态的改变你程序的执行环境。
包含调试信息
cc -g test.c -o fori
(1).简单调试
启动GDB
gdb program
设置运行参数
set args
启动程序
run //执行完毕 或断点处 start 向下执行一行
显示源代码
用list命令来打印程序的源代码。默认打印10行。
Ø list linenum: 打印第linenm行的上下文内容.
Ø list function: 显示函数名为function的函数的源程序。
Ø list: 显示当前行后面的源程序。
Ø list -: 显示当前行前面的源程序。
一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。
Ø set listsize count:设置一次显示源代码的行数。
Ø show listsize: 查看当前listsize的设置。
(2).断点操作
break 设置断点 简写为b
b+行数/函数名/类名/类函数......
显示断点 info b
多文件设置断点
C++中可以使用class::function或function(type,type)格式来指定函数名。
如果有名称空间,可以使用namespace::class::function或者function(type,type)格式来指定函数名。
Ø break filename:linenum -- 在源文件filename的linenum行处停住
Ø break filename:function -- 在源文件filename的function函数的入口处停住
Ø break class::function或function(type,type) -- 在类class的function函数的入口处停住
Ø break namespace::class::function -- 在名称空间为namespace的类class的function函数的入口处停住
条件断点
if(i==5) 断下
continue 执行到第一个断点处
b test.c:8 if Value == 5
维护断点
1.删除断点
delete [range...]
2.暂挺断点生效
disable [range...] 使指定断点无效
3.恢复断点生效
enable [range...]
d 简写
调试代码
-
run 运行程序,可简写为r
-
next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
-
step 单步跟踪,函数调进入被调用函数体内,可简写为s
-
finish 退出进入的函数
-
until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。
-
continue 继续运行程序,停在下一个断点的位置,可简写为c
-
quit 退出gdb,可简写为q
数据查看
p+变量
自动显示
设置自动显示的变量
display B
单步跟踪 挺住时 自动显示
显示自动变量 并删除
info display
显示所有的显示自动变量
delt te dispylay 2
disable 禁用
enable 启用
查看修改变量值
查看变量的类型
ptype i(变量)
查看变量值
p 变量
设置变量值
set var i=9

浙公网安备 33010602011771号