Linux基础
本地连接远程Linux服务器(CentOS)
ssh的公钥加密,私钥解密
电脑中的公钥私钥是用来免密码登陆的
ssh免密码登录Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 的解决方案!
在本地生成密钥。密钥默认保存位置在 ~/.ssh 目录下,打开后会看到私钥文件 id_rsa 和公钥文件 id_rsa.pub。生成过程中会提示输入密码两次,如果不想在使用公钥的时候输入密码,可以回车跳过
ssh-keygen -t rsa -C 'your email@domain.com'
把公钥 id_rsa.pub复制到远程服务器终端默认文件夹下面,然后把公钥追加到服务器ssh认证文件中
//就是把id_rsa.pub里面的内容放到authorized_keys文件中
//如果.ssh(隐藏文件夹)文件夹不存在就自己创建一个
//手动复制也可以
cat /home/id_rsa.pub >> ~/.ssh/authorized_keys
查看服务器ip,终端输入ifconfig,看inet x.x.x.x后面的ip地址。如果ifconfig没有结果,则先安装ssh服务
yum -y install openssh-server
在本地终端输入以下命令连接至远程服务器
ssh <服务器用户名>@<服务器ip>
如果出现拒绝访问的情况解决方法如下:
在终端输入sudo vi /etc/ssh/sshd_config,编辑sshd_config文件,修以下几个字段为yes。
在vim中打开sshd_config文件后直接按i键进行编辑,按:wq进行保存并退出
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes
修改文件后需要重启ssh服务
systemctl restart sshd.service
systemctl status sshd.service #查看ssh服务的状态
systemctl start sshd.service #开启ssh服务
sytemctl enable sshd.service #ssh服务随开机启动,还有个disabled
systemctl stop sshd.ervice #停止
//正常情况下应该是Active:active(running)
同时修改文件的权限。.ssh文件夹的权限为700,.ssh下的authorized_keys文件权限为600或644
chmod 700 ~/.ssh
chmod 0600 ~/.ssh/authorized_keys
软件仓库
命令行
命令关键字 [选项] [参数]
短格式 -单词简写 ls -a
长格式 --单词全拼 ls --all
组合 ls -a -l => ls -al
快捷键
编辑命令
Ctrl + a 移到命令行首, ahead,与home键功能相同
Ctrl + e 移到命令行尾, end, 与end键功能相同
Ctrl + f 按字符前移(右向), forward, 与方向键left功能相同
Ctrl + b 按字符后移(左向), back, 与方向键right功能相同
Alt + f 按单词前移(右向)
Alt + b 按单词后移(左向)
Ctrl + xx 在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Ctrl + w 从光标处删除至字首
Alt + d 从光标处删除至字尾
Ctrl + d 删除光标处的字符, 与delete键功能相同
Ctrl + h 删除光标前的字符, 与backspace键功能相同
Ctrl + y 粘贴至光标后, yank
Alt + c 从光标处更改为首字母大写的单词
Alt + u 从光标处更改为全部大写的单词, uppercase
Alt + l 从光标处更改为全部小写的单词, lowercase
Ctrl + t 交换光标处和之前的字符
Alt + t 交换光标处和之前的单词
Alt + Backspace 与 Ctrl + w 类似,分隔符有些差别
按两次Tab给提示
重新执行命令
Ctrl + r 逆向搜索命令历史
Ctrl + g 从历史搜索模式退出
Ctrl + p 历史中的上一条命令, previous,与方向键up功能相同
Ctrl + n 历史中的下一条命令, next, 与方向键down功能相同
Alt + . 使用上一条命令的最后一个参数
控制命令
Ctrl + l 清屏, clear
Ctrl + o 执行当前命令,并选择上一条命令
Ctrl + s 阻止屏幕输出
Ctrl + q 允许屏幕输出
Ctrl + c 终止命令
Ctrl + z 挂起命令
Linux 目录
/
root --- 启动Linux时使用的一些核心文件。如操作系统内核、引导程序Grub等。
home --- 存储普通用户的个人文件
ftp --- 用户所有服务
httpd
samba
user1
user2
bin --- 系统启动时需要的执行文件(二进制)
sbin --- 可执行程序的目录,但大多存放涉及系统管理的命令。只有root权限才能执行
proc --- 虚拟,存在linux内核镜像;保存所有内核参数以及系统配置信息
1 --- 进程编号
usr --- 用户目录,存放用户级的文件
bin --- 几乎所有用户所用命令,另外存在与/bin,/usr/local/bin
sbin --- 系统管理员命令,与用户相关,例如,大部分服务器程序
include --- 存放C/C++头文件的目录
lib --- 固定的程序数据
local --- 本地安装软件保存位置
man --- 手工生成的目录
info --- 信息文档
doc --- 不同包文档信息
tmp
X11R6 --- 该目录用于保存运行X-Window所需的所有文件。该目录中还包含用于运行GUI要的配置文件和二进制文件。
X386 --- 功能同X11R6,X11 发行版5 的系统文件
boot --- 引导加载器所需文件,系统所需图片保存于此
lib --- 根文件系统目录下程序和核心模块的公共库
modules --- 可加载模块,系统崩溃后重启所需模块
dev --- 设备文件目录
etc --- 配置文件
skel --- home目录建立,该目录初始化
sysconfig --- 网络,时间,键盘等配置目录
var
file
lib --- 该目录下的文件在系统运行时,会改变
local --- 安装在/usr/local的程序数据,变化的
lock --- 文件使用特定外设或文件,为其上锁,其他文件暂时不能访问
log --- 记录日志
run --- 系统运行合法信息
spool --- 打印机、邮件、代理服务器等假脱机目录
tmp
catman --- 缓存目录
mnt --- 临时用于挂载文件系统的地方。一般情况下这个目录是空的。
在我们将要挂载分区时在这个目录下建立目录,再将我们将要访问的设备挂载在这个目录上,这样我们就可访问文件了。
tmp --- 临时文件目录,系统启动后的临时文件存放在/var/tmp
lost+found --- 在文件系统修复时恢复的文件
/
根目录,一般根目录下只存放目录,不要存放文件。
/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中。
/bin, /usr/bin
可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
/boot
放置linux系统启动时用到的一些文件。/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。
/dev
存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱mount:
/dev/cdrom、/mnt
/etc
系统配置文件存放的目录,不建议在此目录下存放可执行文件。
重要的配置文件有:/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
修改配置文件之前记得备份。
注:/etc/X11存放与x windows有关的设置。
/home
系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下。
~表示当前用户的家目录,~test表示用户test的家目录。
建议单独分区,并设置较大的磁盘空间,方便用户存放数据。
/lib,/usr/lib,/usr/local/lib
系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules。
/lost+fount
系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。
如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found
/mnt,/media
光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。
/opt
给主机额外安装软件所摆放的目录。
如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。
以前的 Linux 系统中,习惯放置在 /usr/local 目录下。
/proc
此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间。
比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等。
/root
系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。
/sbin,/usr/sbin,/usr/local/sbin
放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。
与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。
/tmp
一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
/srv
服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。
/usr
应用程序存放目录。
/usr/bin 存放应用程序。
/usr/share 存放共享数据。
/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。
/usr/local 存放软件升级包。
/usr/share/doc 系统说明文件存放目录。
/usr/share/man 程序说明文件存放目录。
使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容。
建议单独分区,设置较大的磁盘空间。
/var
放置系统执行过程中经常变化的文件。
/var/log 随时更改的日志文件。
/var/log/message 所有的登录文件存放目录。
/var/spool/mail 邮件存放的目录。
/var/run 程序或服务启动后,其PID存放在该目录下。
建议单独分区,设置较大的磁盘空间。
root@ubuntu:~#
root: 当前用户名@:at, 在ubuntu:主机名~: 当前用户home目录#:超级用户$:普通用户
文件命令
-
sudo su:切换成root用户 -
exit:退出root用户 -
cd
基本格式:cd 目录(绝对路径/相对路径)
cd directory切换到当前目录下的子目录
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd ~/cd:返回当前用户的家目录
cd -:返回到上次的目录
- ls
ls [选项] [目录] 展示指定目录的内容
ls 展示当前目录内容
-l:查看文件详细情况(可查看文件类型) 别名:ll
-a:显示所有文件(包含隐藏文件)
-A:显示所有文件(.和..不展示)
-h:友好易读的方式展示,必须和-l一起使用 ll -h
-R:递归展示所有文件
- tree
tree path 显示指定路径的目录树结构
- du:查看文件或目录磁盘的占用情况
du 文件
-a:展示文件大小
- df
df -h 查看当前文件夹下的目录或文件所使用磁盘空间的详细情况。
pwdwhich
which ls 查看外部命令的位置,内部命令无法查看。
head
head -5 stdio.h 查看前五行内容,不加参数默认是10行。
tail
tail -5 stdio.h 查看后5行内容, 不加参数默认是10行。
- 创建文件:
touch - 创建目录:
mkdir
mkdir dirname 创建目录。
mkdir dir1/dir2/dir3 -p 按层次创建目录。
- 拷贝文件或者目录:
cp
cp 源文件 目标文件
-i 覆盖时提示
-f 强制覆盖
-r 递归复制
cp hello.c temp 在当前目录下生成一个temp文件,并把hello.c的内容写入文件
如果temp不存在,则创建文件;如果存在,则覆盖已有文件
cp mydir newdir -r 在当前目录下生成一个newdir目录,并把mydir目录里面的目录或文件拷贝过去
如果目录不存在,则创建;如果存在,则mydir目录本身也拷贝到newdir目录下
- 移动文件:
mv
mv 源文件 目标文件
-i 覆盖时提示
-f 强制覆盖
-r 递归复制
-u 目标文件不存在,源文件比目标文件要新的时候才移动
mv test.c hello.c 移动到。多用于重命名目录或文件
- 删除文件:
rm(谨慎使用)
rm 目标文件
-i 删除时提示
-f 强制删除
-r 递归删除整个目录树
-rf 递归强制删除
rm -rf dirname 递归强制删除文件夹下的目录和文件,实际使用中常用
rm -ri dirname 递归删除并提示用户删除了哪些目录或文件
极度危险的命令:rm -rf /
- cat
cat test.txt 查看文件的内容,缺点内容太多时查看困难。
- more
more stdio.h 分屏查看文件,Enter下翻一行,Space下翻一页,缺点不能往回看。
- less
less stdio.h 分屏查看文件。比more更实用,可以来回翻页。
ctrl + p 上翻一行
ctrl + n 下翻一行
ctrl + b 上翻一页
ctrl + f 下翻一页
q 退出
- echo:输出指定字符串或者变量
echo "hello" 打印字符串
echo $PATH 打印环境变量
echo $? 显示上一次程序退出值
- ln:创建连接
ln -s ~/.vim/.vimrc .vimrc 创建软链接,相当于windows下的快捷方式,可用于目录或文件。
路径要用绝对路径,这样软链接拷贝到哪里都是有效的。
如果删除原文件,则软链接失效。
ln .vimrc .vimrc.hard 创建硬链接,只能用于文件。不必使用绝对路径。
创建后生成的硬链接与原文件引用同一个inode,硬链接本身不占硬盘空间。
如果删除原文件,硬链接仍然有效。
- alias:查看别名
alias la='ls -a -l':设置别名
unalias la:取消别名
- |: 管道符,把前面命令的输出当做后面命令的输入
压缩和解压文件
- 打包:多个文件变成一个总文件
- 归档:
tar - 压缩:
tar和gzip

-
tar -- 不使用z或j参数,该命令只能对文件和目录打包
-
参数
c 创建--压缩时使用。 x 释放--解压缩时使用。 v 显示提示信息--压缩和解压缩都可以使用,可以省略。 f 指定压缩文件的名字 z 使用gzip的方式压缩文件 j 使用bzip2的方式压缩文件 -
压缩
用法:tar zcvf 生成的压缩包的名字(xxx.tar.gz) 要压缩的文件或目录 示例:tar zcvf alltxt.tar.gz *.txt test/ 同时对文件和目录进行打包压缩 用法:tar jcvf 生成的压缩包的名字(xxx.tar.bz2) 要压缩的文件或目录 示例:tar jcvf alltxt.tar.bz2 *.txt test/ 同时对文件和目录进行打包压缩 -
解压缩
tar zxvf 压缩包的名字 解压到当前目录 tar jxvf 压缩包的名字 -C 目录 解压到指定目录
-
-
rar
-
参数
a Add压缩 x Extract解压缩 r 压缩时递归目录,不加这个参数默认就是递归的 -
压缩
用法:rar a 生成的压缩文件的名字 压缩的文件或目录 示例: rar a all *.txt 打包压缩文件 rar a dir dir/ 打包压缩目录 -
解压缩
用法:rar x 压缩文件名 [解压缩目录] 示例:rar x all.rar
-
-
zip
-
参数
r 压缩目录时加个参数用于递归目录,不加不能压缩 -
压缩
用法:zip 压缩包的名字 压缩的文件或目录 示例:zip all *.txt zip -r myzip mytest/ -
解压缩
用法:unzip 压缩包的名字 unzip 压缩包的名字 -d 解压的目录 示例:unzip all.zip unzip all.zip -d test/
-
用户管理
-
所有的用户都在
home下,root除外 -
查看当前用户
whoami 查看当前用户名。 id 查看当前用户信息,如用户名,所属群组,UID,GID等。 -
创建用户
adduser super 用户名只能小写,不能大写 useradd -s /bin/bash -g super -d /home/super -m super 用户名可以大写 -s 指定新用户登陆时shell类型 -g 指定所属组,该组必须已经存在 -d 用户家目录 -m 用户家目录不存在时,自动创建该目录 -
设置用户组
groupadd super -
删除用户
deluser super userdel -r super 选项-r的作用是把用户的主目录一起删除 -
切换用户
su super -
修改用户密码
passwd super -
退出当前用户
exit -
查看所有用户信息
vi /etc/passwd
权限管理
-
修改目录或文件权
-
文字设定法
d: 目录 l:链接 r:读 w:写 x:执行 -:没有相应权限 chmod [who] [+|-|=] [mode] who : 不指定的话,默认是所有 文件所有者:u 文件所属组:g 其他人:o 所有人:a mode r : 读 w : 写 x : 执行 chmod o+w temp 给其他人加写权限。 chmod a-x temp 给所有人去除执行权限。 chmod a=r temp 所有人只有读权限。 -
数字设定法
- 0 没有权限 r 4 读 w 2 写 x 1 执行 chmod 755 temp -rwxr-xr-x chmod -001 temp -rwxr-xr--
-
-
修改目录或文件所有者与所属组
chown root temp 把文件temp的所有者修改为root。 chown super:root temp 把文件temp的所有者修改super,所属组修改为root。 -
修改目录或文件所属组
chgrp root temp 修改文件所属组为root
数据操作
- 搜索文本:
grep- 可配合正则表达式
- 文件统计:
wc
流、管道、重定向
- 大于
>:将结果重定向到文件中>>:追加到末尾 - 将两个命令连成管道,也就是将一个命令的输出当成另外一个命令的输入:
|
进程管理
软件:glances,htop
- 显示系统当前活动的用户:
w - 后台运行进程:
&符号和nohup- 要运行的命令+
&(后台与终端关联) nohup:关闭终端后程序依然运行- 可以
nohup和&一起使用
- 要运行的命令+
- 使前台转后台:先
Ctrl+z:转到后台,并停止运行,然后用bg命令使进程重新运行起来 - 显示后台进程状态:
jobs - 使进程转到前台:
fg

-
查看在线用户状态
who 查看当前在线用户的状态 -
查看进程
//进程静态列表 ps aux 查看在线用户下所有进程 ps aux | grep bash 进程过滤 -
终止进程
kill -l 查看所有信号 kill -SIGKILL 5179 终止进程 kill -9 4678 终止进程 -
查看当前进程的环境变量
env 查看所有环境变量 env | grep PATH 只查看PATH环境变量 -
进程动态列表:
top
定时和延迟执行
- 在制定时刻运行一次程序:
at - 列出正在等待的at任务:
atq - 删除正在等待的at任务:
atrm - 定时执行程序:
crontab(重复执行)
#安装crontab
sudo yum install vixie-cron crontabs
chkconfig crond on #开机自启
service crond start

网络与FTP
- 下载文件:
wegt - 网间拷贝:
scp
#默认端口22
#从自己电脑拷贝文件到另一台电脑
scp file.txt root@192.168.1.5:/root
#从另一台电脑拷贝文件到自己电脑
scp root@192.168.1.5:/root/file.txt file_copy.txt
防火墙
待补充
搭建FTP
待补充
服务区管理
systemd
Apache
#安装Apache
sudo yum install httpd
#查看Apache运行状况
ps -aux | grep httpd
#开启Apache
systemctl start httpd
#开启后可用127.0.0.1访问
#按道理开启服务之后别的主机也应该能访问?但是因为防火墙80端口默认关闭。
#在自己电脑配置需要在同一局域网下去访问。互联网访问就需要一个公网IP
#查看开放的端口
sudo firewall-cmd --list-port
#开放80端口,两种方式。https默认端口443
systemctl stop firewalld #1 直接关闭防火墙
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent #2 只开放80端口
sudo firewall-cmd --reload #重载配置的防火墙策略
sudo systemctl reload httpd #重新加载 Apache 服务的配置文件
sudo systemctl status httpd #状态查看详情信息
#放行数据库
firewall-cmd --zone=public --add-port=3306/tcp --permanent
Apache配置文件

主配置文件三类参数
- 注释
- 全局配置
- 区域配置:Directory
SELINUX 安全子系统
- 使得Apache只能访问指定的目录,别的文件不能访问。所以修改Apache配置后可能不能起作用
- 查看状态:命令行
sestatus - 通过
semanage包去管理SELINUX



Vim

命令模式 -- 打开文件之后,默认进入命令模式
- 移动光标
h 左
j 下
k 下
l 右
0 行首
$ 行尾
gg 文件头部
G 文件尾部
5G 行跳转,移到第五行
- 删除操作(不是真正意义上的删除,更象是剪切操作)
x 删除光标后一个字符
X 删除光标前一个字符
dw 删除光标后一个单词
d0 删除光标到行首的所有字符
D(d$) 删除光标到行尾的所有字符
dd 删除一行
5dd 删除五行
- 撤消操作
u 撤消
ctrl+r 还原前一个操作
- 复制粘贴
p 小写的p,粘贴到光标的下一行
P 大写的p,粘贴到光标的所在行
yy 复制一行
5yy 复制五行
- 可视模式
v 切换到可视块模式
h/j/k/l 调整选中块
y 复制
d 删除
p 粘贴
- 查找模式
/ 切换到查找模式,向下查找
? 切换到查找模式,向上查找
n 下一个匹配
N 上一个匹配
# 移到要查找的单词上,按#号即可开启查找模式
- 字符替换
r 单个字符替换
- 行缩进
>> 向右缩进
<< 向左缩进
插入模式 -- 需要输入一些命令,切换到编辑模式
a 在光标所在位置的后边插入
A 在当前行的尾部插入
i 在光标所在位置的前边插入
I 在光标所在行的行首插入
o 在光标所在行的下边开辟一个新的行
O 在光标所在行的上边开辟一个新的行
s 删除光标后边的字符
S 删除光标所有的行
交互模式 -- 在末行模式下可以输入一些命令
:s/tom/jack/g 把光标所在行的tom替换成jack
:%s/tom/jack/g 把整个文档的tom替换成jack
:25,30s/tom/jack/g 把25到30行的tom替换成jack
:q 退出
:q! 强制退出
:w 保存
:wq 保存并退出
:x 相当于:wq
ZZ 相当于:wq
分屏操作
:sp [file] 将屏幕水平分成两部分
:vsp [file] 交屏幕垂直分成两部分
:wqall 同时保存打开文件
ctrl+ww 切换两个屏幕
vim打造成IDE
/etc/vim/vimrc 系统级配置文件
~/.vim/vimrc 用户级配置文件
GCC
- gcc编译的四个阶段
hello.c ----> hello.i -----> hello.s ----> hello.o ----> hello.out
预处理编译器(cpp) 编译器(gcc) 汇编器(as) 链接器(ld)
gcc -E gcc -S gcc -c gcc
- 编译工具链
预处理编译器:cpp gcc -E hello.c -o hello.i 头文件展开,宏替换,注释去掉
编译器:gcc gcc -S hello.i -o hello.s c文件变成汇编文件
汇编器:as gcc -c hello.s -o hello.o 汇编文件变成二进制文件
链接器:ld gcc hello.o -o hello 将函数库中相应的代码组合到目标文件中
- 直接编译生成可执行文件
gcc hello.c -o hello
- 编译时指定头文件目录-I
gcc hello.c -I ./include hello
- 编译时指定宏,通常用于调试代码-D
gcc hello.c -D DEBUG
在需要打印日志的代码中加上下面的语句:
#ifdef DEBUG
printf("debug info");
#endif
- 编译时对代码进行优化-O3
gcc hello.c -o hello -O3
级别:
0 没有优化
1 缺省值
3 优化级别最高
- 编译时显示告警信息-Wall
gcc hello.c -o hello -Wall
- 编译时包含调试信息-g(gdb)
gcc hello.c -o hello -g
- 查看编译版本
gcc -v
gcc --version
静态库
目录结构
myCalc
├── include
│ └── head.h
├── lib
│ └── libMyCalc.a
├── main.c
└── src
├── add.c
├── div.c
├── mul.c
├── sub.c
- 命名格式
1 以lib开头
2 静态库名
3 .a结尾
示例 : libMyCalc.a
- 描述
优点
寻址方便、速度快
库被打包到可执行程序中,直接发布可执行程序即可使用
缺点
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
如果静态函数库改变了,那么你的程序就必须重新编译
使用场合
在核心程序上使用,保证速度,忽略空间
主流应用于80、90年代,现在很少使用
- 得到与位置有关的
*.o
cd ~/myClac/src
gcc *.c -c -I ../include
- 将生成的
*.o文件打包成静态库libMyCalc.a
ar rcs libMyCalc.a *.o
ar工具不包含在一gcc中。
参数:
r 将文件夹插入到静态库中。
c 创建静态库,不管库是否存在。
s 写入一个目标文件索引到库中,或者更新一个存在的目标文件。
制作好以后移动到lib目录中
mv libMyCalc.a ../lib
- 查看库中的符号(函数)
nm libMyCalc.a
- 发布静态库,把
include和lib目录打包给用户 - 使用
//在main.c中包含头文件
#inlcude "head.h"
//两种编译方式
gcc main.c lib/libMyCalc.a -I include -o myapp
gcc main.c -I include -L lib -l MyCalc -o myapp
//执行myapp
./myapp
动态库
- 准备
目录结构
myCalc
├── include
│ └── head.h
├── lib
│ └── libMyCalc.so
├── main.c
└── src
├── add.c
├── div.c
├── mul.c
├── sub.c
- 命名格式
1 以lib开头
2 静态库名
3 .so结尾
示例 : libMyCalc.so
- 描述
优点
执行程序体积小
动态库更新了,不需要重新编译程序,前提是函数接口不变
缺点
发布程序的时候,需要将动态库提供给用户
动态库没有被打包到应用程序中,加载速度相对较慢
使用场合
现代应用程序中常用
- 生成与位置无关的
*.o
cd ~/myClac/src
gcc -fPIC *.c -c -I ../include
- 将生成的
*.o文件打包成共享库(动态库)libMyCalc.so
gcc -shared -o libMyCalc.so *.o -I ../include
制作好以后移动到lib目录中
mv libMyCalc.so ../lib
- 查看库中的符号(函数)
nm libMyCalc.so
- 发布静态库,把
include和lib目录打包给用户 - 使用
//在main.c中包含头文件
#inlcude "head.h"
//两种编译方式
gcc main.c lib/libMyCalc.so -I include -o myapp
gcc main.c -I include -L lib -l MyCalc -o myapp
//执行myapp
./myapp
//查看可执行文件夹所依赖的动态库
ldd myapp
-
解决依赖的动态库无法加载的问题
1 把
libMyCalc.so拷贝到/lib目录下(不推荐使用,容易与系统库冲突)
cp lib/libMyCalc.so /lib
2 设置环境变量LD_LIBRARY_PATH(测试时使用)
export LD_LIBRARY_PATH=./lib 只对当前会话有效
3 设置环境变量LD_LIBRARY_PATH到~/.bashrc中(测试时使用)
vi ~/.bashrc
export LD_LIBRARY_PATH=/home/super/myCalc/lib 会话每次开启就会生效
4 设置配置文件/etc/ld.so.conf(推荐使用),重启终端
//编辑动态连接器的配置文件
vi /etc/ld.so.conf
//动态库的路径写到配置文件中
/home/super/myCalc/lib
//更新动态库
ldconfig -v
gdb调试
启动gdb
gdb app
查看代码
>>>(gdb) l #list
>>>(gdb) l 行号或函数名
>>>(gdb) l 文件名:行号或函数名
设置断点
- 设置当前文件断点
>>>(gdb) b #break
>>>(gdb) b 行号或函数名
>>>(gdb) b 文件名:行号或函数名
- 设置条件断点
>>>(gdb) b 10 if value==19
- 删除断点
>>>(gdb) d 断点的编号 #delete或del
查看设置的断点
>>>(gdb) i b #info, 可以获取断点的编号,删除断点时用
开始执行gdb调试
>>>(gdb) start #只执行一步
>>>(gdb) c #continue,直接停在断点的位置
>>>(gdb) run #有断点会停在断点处,没有会直接跑完程序,较少用
单步调试
>>>(gdb) s #进入函数体内部
>>>(gdb) finish #从函数体内部跳出
>>>(gdb) n #不进入函数体内部
>>>(gdb) u #退出当前循环
查看变量的值
>>>(gdb) p print
查看变量的类型
>>>(gdb) ptype 变量名
设置变量的值
>>>(gdb) set var 变量=值
设置追踪变量
>>>(gdb) display 变量 #设置追踪变量
>>>(gdb) info display #获取变量的编号
>>>(gdb) undisplay 编号 #取消追踪变量
退出gdb调试
>>>(gdb) quit
Git
#初始化
git init
#激活颜色选项:
git config --global color.ui auto
git与github绑定:把本地的共钥复制到github中的ssh设置中
Nginx
Django Linux+Nginx+uWSGI环境下部署(含Nginx返回400问题处理、防火墙管理)
#安装Nginx,默认80端口
#80与Apache可能冲突了,但是修改端口时要先把修改的端口用SELINUX子系统开放,并且打开防火墙
yum install epel-release
yum install nginx
#查看Nginx相关文件
rpm -ql nginx
/etc/nginx/nginx.conf为主要配置文件
Squid
待补充
Docker
寻找云平台操作Docker
待补充
Shell
#!/bin/bash
#第一行用来指明用那个shell运行脚本
#如果文件在环境变量所包含的文件夹下,那么可以直接输入文件名就能执行脚本了
运行之前要给脚本加可执行权限
使用./test.sh运行脚本test.sh

浙公网安备 33010602011771号