1、Linux下的快捷键:
Ctrl + p 上一条命令;Ctrl + n下一条命令
Ctrl + b 向前移动光标,Ctrl + f 向后移动光标
Ctrl + a 光标移动到命令行开头,Ctrl + e移动到行位
Ctrl + h 删除光标前一个字符,Ctrl + d删除光标后一个字符
Ctrl + u删除光标前面所有字符
2、Linux目录结构
1)根目录 / ls/cd / 查看或进入根目录
2)/bin:经常使用的命令
3)/boot:开机启动项 不要改
4)/dev:设备文件,linux外部设备
5)/etc:主要保存的是操作系统需要的配置文件
6)/home: 用户的文件夹,普通用户
7)/lib:存放的都是需要的动态链接库也称之为共享库
8)/lost+found:存的都是文件碎片
9)/media:挂在外设的,U盘,光驱,挂在成功后里面就是u盘里面的内容。
10)/mnt:和上面一样,手动挂载
11)/opt:第三方软件
12)/proc:内存映射
13)/root:超级用户自己的目录
14)/sbin:管理员使用的
15)/usr:是一个用户应用程序和文件都放在这个目录下,类似于program file 目录
3、cd - 去上一个目录
4、前面提示字符串代表的意思:ubuntu@ubuntu:~$
当前登录的用户@在哪 ubuntu主机名(创建Linux时自己创建的) ~用户的家目录,也叫宿主目录,$代表当前用户为普通用 户,超级用户是#
exit退出root用户
5、tree 加目录可以查看目录里面所有的文件
6、d是目录,l链接文件,b块设备,c字符设备,s是Socket文件,p是管道文件 f普通文件 压缩文件是普通文件
7、文件的创建和删除
mkdir 创建文件夹
mkdir aa/bb/cc -p 创建嵌套的目录
rm -ri 会提示是否要删除的信息
删除文件夹时要rm-r
8、文件和目录的拷贝
cp dirname /dirpath 会把这个文件复制到你想要复制的地方
cp dirname/* dirpath 把这个文件夹下面的所有东西赋值到指定目录,但是不包括这个目录本身
9、显示文件中的内容
最常用的就是cat
head/tail 加参数 可以显示文件 前多上行和后多少行 head -10 dirName
还有more less 不会一下全显示出来,按回车可以继续
10、mv命令
1)、更改文件名称 mv dirneme ./dirname2
2)、移动到某个文件夹下 mv dirname /dirPath
11、软/硬链接
软:ln -s dirName(文件名) dirName(链接名) 尽量用绝对路径来创建链接,否则无法全局使用,还可以给目录创建软连接
硬:ln dirName(文件名) dirName(链接名) 不加参数 不能给目录硬链接
12、不常用命令
which命令,查看命令在那个目录下
date 查看当前时间
history查看自己以前输入过什么命令
who查看当前用户状态
man man 进入man手册
echo 输出字符串 echo $PATH 打印环境变量
13、修改文件权限
1)、查看当前登录用户 whoami
2)、修改文件权限:chmod [who] [+|-|=] [mode]
[who] :所属用户 :u 所属组:g 其他:o 所有:a
[+|-|=]:增加,删除,覆盖某个权限
[mode] r w x
3)、例: chmod u+w fileName
4)、数字设定
chmod 777 fineName
chomd -001 fileName 减少某个属性
14、修改文件所有者和所属组:
chown 改变所有者 chown 所有者名称 文件名
chown 用户名1:用户名2 改变文件所有者和所属者 所有者是用户名1,所属组是用户名2
chgrp改变文件所属组
文件必须有执行权限 X
15、查找文件或内容
find 查找的目录 -name 文件名
find 查找的目录 -size -10k(小于10k) +10k(大于10K) 范围 -size +10k -size +100k
find 查找的目录 -type 文件类型
grep -r "查找的内容" +"查找的路径" 在和管道配合使用时可以不加 -r
grep把要搜索的路径放在后面
16、安装软件
在线安装 apt-get install ***
删除 apt-get remove tree
更新软件列表 apt-get updata
清理所有软件安装包 apt-get clean /var/cache/apt/archives下面的.deb文件
aptitude 和apt-get类似
已经下载好的安装包(.deb文件)
sudo dpkg -i 名字
sudo dpkg -r 卸载
源码安装
1、解压缩源代码包
2、进入到安装目录
3、检测文件是否缺失 创建Makefile 检测编译环境 ./configure 可能会加参数
4、make
5、make install
6、看readme
17、U盘的挂载
1、sudo fdisk -l 查看设备名字
2、挂载 sudo mount /dev/sdb1 /mnt
3、卸载 umount /mnt
18、压缩文件
tar jcvf 压缩文件名.bz2 要压缩的文件或目录
tar zcvf 压缩的文件名.gz 要压缩的文件或目录
tar jxvf 压缩包的名字.bz2
tar zxvf 压缩包的名字.gz
加参数-C可以添加目录,解压到那个目录
c--创建
x--释放
v--显示提示信息--可以省略
f--指定压缩文件的名字
z--使用gzip方式压缩 -- .gz
j--使用bizp2的方式压缩文件 --.bz2
19、rar压缩和解压缩、
1)、必须安装该软件
2)、参数
压缩 : a
解压缩 :x
3)、格式
压缩rar a 生成的压缩包的名字(后缀不用写) 要压缩的文件或者目录
解压缩:rar x 压缩文件名 可以跟目录 解压到某个目录
20、zip压缩和解压缩
1)、参数
压缩目录需要参数-r
2)、压缩
zip 生成的压缩包的名字(后缀不用写) 要压缩的文件或者目录
3)、解压缩
unzip 压缩包的名字 -d +解压目录
21、ps命令的使用
ps用于查看进程 加参数 -au 会更加详细
每启动一个应用程序就是一个进程
ps x 查看没有终端的应用程序
Linux下如何切换设备终端:
Ctrl + Alt + F1-F7
管道的概念:
文件过滤 命令1 | 命令2 把命令1的输出作为命令2的输入
22、 kill命令的使用
kill -l 查看信号
kill -SIGKILL +进程号或者kill -9 +进程号
23、env 和 top命令
env查看当前进程环境变量 只输出PATH env | grep PATH
linux环境变量格式 key = value 每个:都是一个value值
top打开任务管理器
24、网络相关的:
ifconfig 查看ip地址
ping www.baidu.com -c 4 显示四条之后就自动停止
nslookup 查看服务器域名对应的IP地址
25、管理用户
addusr + 要创建的用户 但是用户名不能有大写
usradd -s /bin/bash -g Robin -d /home -m 名字
-s指定什么类型的shell编译器 -g 所属组 -d 家目录 -m就是名字
先用gropuadd 添加-g后面的组
删除用户:
deluser + 用户名,家目录需要手动删除
userdel -r 用户名 ,家目录可以删掉
26、ftp服务器配置
1)、先下载 vsftpd
apt-get install vsftpd
2)、修改配置文件 /etc/vsftpd.conf
anonymous_enable=YES
是否允许匿名用户登陆
write_enable=YES
实名用户拥有写权限
local_umask=022 放开
anon_mkdir_write_enable=YES
匿名用户可以在ftp上创建文件夹
service vsftpd restart 重启服务器
27、实名登陆ftp服务器和匿名登陆ftp服务器
实名登陆:
客户端:
ftp + IP(用户名的IP)
文件的上传,put+文件名,文件必须是你在哪个文件夹下进入的,才能传哪个文件夹下面的东西
下载 get + 文件名 不能操作文件夹,想要操作就打包
匿名用户登陆ftp
1)、在/etc/vsftpd.conf下加anon_root=/home/aston/MyFtp/ =左右不要有空格 /home/aston/MyFtp/是匿名用户的根目录
2)、ftp + ip 用户名写anonymous (必须) 密码:不写 就进入了匿名进入ftp
3)、不允许任意切换,在制定范围内工作,需要自己添加匿名用户目录
28、ftp链接ftp
是一个软件可以链接ftp
lftp + ip 输入login匿名进入
lpwd就可以查看在那个目录下进入的ftp,lcd可以更改
mput可以上传多个
mirror -R 可以上传目录,文件夹
mirror 可以下载文件夹
29、ssh
1)、下载 openssh-server
2)、远程登录ssh usrName@IP
3)、退出 logout
30、scp命令
超级拷贝
scp -r 目标用户名@目标主机IP:/文件绝对路径 /保存到本机的哪个路径
31、vim中常用的操作
光标移动 H J K L
前 下 上 后
0移动到行首,shift + 4 移动到行尾
移动到文件头部gg G文件尾部
移到某行500G
删除光标后面的字符 x 删除光标前面的字符 X
删除光标前面的单词 dw 删除后面的单词 de
删光标前的所有d0 后的 shift D
u是撤销
Ctrl + r 反撤销
删除多行ndd
32、vim中的复制和粘贴
删除的本质是剪切
p可以在光标下一行进行粘贴
大写P可以在当前行进行粘贴
yy是复制 nyy复制多行
33、可视模式和查找
v进入可视,移动光标就是选中的内容,一个y就是复制 p粘贴
查找:
1)/加你要查的东西,n是切换下一个 N是上一个
2)?也是查找,/是向下查找,?是向上查找
3)查一个单词出现过多少次:
光标移动到单词处,#,n切换
r可以替换当前字符,只能是单个字符
缩进:
向右>>向左<<
shift +k 进入man手册
34、末行模式下的操作
:s/要替换的字符/用什么替换/ 把当前行的第一个换成你想换的
:s/要替换的字符/用什么替换/g 文件中所有的
:20,30s/要替换的字符/用什么替换/ 20到30行的东西
:!加命令可以操作 例如!pwd
35、分屏操作:
sp水平分局
vsp垂直分局
wqall都关闭
36、gcc的一些参数
预处理器:cpp 头文件展开,宏替换,注释去掉 gcc -E hello.c -o hello.i
编译器: C文件变成汇编文件 gcc -S hello.i -o hello.s
汇编器: 汇编文件变成2进制文件 gcc -c hello.s -o hello.o
连接器: 将函数库中对应的代码组合到目标文件中 gcc hello.o -o hello
-o生成另外的名字
-I 指定头文件目录
-D编译的时候定义宏
-O优化程序 -O1(2/3)
-Wall 输出警告信息
-g在程序中添加一些调试信息
37、 静态库的制作和使用
1)、命名规则
1)、lib+库的名字+.a
2)、libmytest.a
2)、制作步骤
1)、生成.o文件 gcc -c *.c
2)、将生成的.o文件打包 用 ar rcs 静态库的名字(libmytest.a)+要打包的文件
3)、发布和使用静态库
1)、发布静态库
2)、头文件(包含库里提供了什么函数)
3)、会给一个测试函数 main.c
两种使用方法:
gcc main.c lib/libMycalc.a -o sum
gcc main.c -Iinclude -L lib -l MyCalc -O myapp
-I指定头文件目录,-L指定库的目录 -l 指定库的名字 -O 编译生成的名字
nm .a可以查看静态库里面有什么
38、共享库的制作
1)、命名规则 lib+名字+.so
2)、步骤
生成与位置无关的代码(生成与位置无关的.o)
将.o打包
gcc -fPIC *.c就是生成了位置无关代码
与位置有关每次编译都会把代码放到固定位置
共享库有一段自己的内存,而且在程序运行起来之后再调用共享库,每次的位置是不一定的
gcc -shared -o 要生成共享库的名字(lib**.so) *.o
3)、使用
main.c是测试文件
gcc main.c lib/lib**.so -o app
gcc main.c -Iinclude -L lib -l MyCalc -O myapp
./app后会报错
ldd命令查看我们可执行文件所以来的所有的共享库
把生成的.so拷贝到/lib中,可以成功
LD_LIBRARY_PATH 把库的路径给这个环境变量 本来里面是什么都没有的,给他赋值
export LD_LIBRARY_PATH = ./lib 是临时的
vi /.bashrc export LD_LIBRARY_PATH = ./lib 写到最后一行
1)、找到动态连接器的配置文件 /etc/ld.so.config
2)、动态库的路径写到配置文件中 把目录写入进去
3)、更新 -- sudo ldconfig -v
38、gdb调试:
gdb调试:
编译一个程序 gcc -o app a.c -g生成的app里面会有调试信息
gdb app 会进入调试模式
按l可以查看代码,默认是打开带main.c的
可以l+文件名
也可以 l + 文件名:行号
或者 1 + 文件名:函数名
b + 行号可以加断点
条件断点:b 15 if i==15
查看断点信息 i b
start启动gdb,但是只执行一步,n单步调试,c是继续执行到断点处
s进入到函数体内部,l查看函数代码 l+行数打断点 c停到断点处
不进入函数体 n
p+变量名可以查看变量值是多少,数组名也可以
ptype查看变量类型
display i 追踪i的值,适用于循环,每次可以打印i的值
undisplay可以取消追踪,但是要先查看编号 info display 然后 undisplay +编号
u跳出单次循环
finish跳出当前函数,前提是要取消断点,del加断点编号
set var i = 10 当i = 10的时候才看,相当于直接把for循环的值变成了10
39、编写一个简单的makefile 一个规则 两个函数 三个自动变量
一个规则:模式规则
模式规则
%.o:%.c
gcc -c $< -o $@
两个函数:
makefile中所有的函数都有返回值
1、查找指定目录下,指定类型的文件
src =$(wildcard ./*.c)
2、匹配替换函数
obj = $(patsubset ./%.c, ./%.o, $(src)) 把目录下的.c文件切换成.o文件
三个自动变量: $< 规则中的第一个依赖 $@规则中的目标 $^规则中的所有依赖
makefile 中的变量
obj = main.o add.o ...
target = app
$(target):$(obj)
gcc $(obj) -o $(target)
/makefile中自己维护的变量,都是大写
CC = cc 就是gcc
CPPFLAGS = -I 预编译时需要的参数
CFLAGS:编译的时候使用的参数 -Wall -g -c
LDFLAGS:链接库使用的选项
40、makefile 例子:
target = app
src =$(wildcard ./*.c)
obj = $(patsubset ./%.c, ./%.o, $(src))
CC = gcc
CPPFLAGS = -I
$(target):$(obj)
gcc $(obj) -o $(target)
%.o:%.c
gcc -c $< -o $@
.PHONY clean 声位为伪目标
clean:
-rm 前面加-:如果执行失败,继续向下执行
rm $(obj) $(target) -f 强制执行,存在不存在都执行不报错
hello:
echo "hello,makefile"
41、C库函数:
FILE*fp 里面的内容
文件描述符 int类型 最多打开1021个文件
文件读写指针位置
I/O缓冲区(内存地址)
几种情况把缓冲区里的数据写到硬盘里
1 刷新缓冲区 fflush
2 缓冲区已满
3 正常关闭文件
1 fclose
2 retuen (main函数)
3 exit (main 函数)
42、虚拟地址空间
程序运行起来就会有一个进程,就会为这个进程分配虚拟地址空间
0-3G用户区 3-4G内核区 (内存管理 进程管理 设备驱动管理 VFS虚拟文件系统)
文件描述符就在内核区,里面有一个PCB进程控制块,里面有一个文件描述符的表,是一个数组,大小是0-1023
默认0-3被占用,STDIN_FILENO STDOUT_FILENO STDERR_FILENO 标准输入 标准输出 标准错误
0-3G用户区 从下往上
0-4k被保护区
Linux下可执行文件都是ELF格式
text代码段
.data(已初始化全局变量)
bss(未初始化全局变量)
堆空间 向上增长
共享库:里面有C标准库 linux系统io函数
栈空间 向下增长
环境变量
内核区
虚拟地址空间用处:
1 方便编译器和操作系统安排程序的地址分布
程序可以使一系列相邻的虚拟地址来访问物理中不相邻的大内存缓冲区
2 方便进程之间的隔离
不同进程使用的虚拟地址彼此隔离,一个进程的代码无法更改正在由另一进程使用的物理内存
3 方便操作系统使用你那可怜的内存
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区
读大文件:写到另一个文件
两种方式,那种更高
read write --每次读一个byte 更改缓冲区大小 也可以和下面的方法效率一样 这个缓存区是我们自己维护的
getc putc -- 每次读一个byte --效率高
标准C库函数有一个缓冲区
43、C库函数与系统函数的关系
printf函数 ->标准输出(student): FILE*fp
向下调用Linux系统API 分
应用层 write(fd,"hello",5)
系统调用 sys_write向内核操作
内核层 设备驱动函数
44、open函数介绍
man 2 open
1)、需要引入的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
2)、函数原型
前提是已经存在
int open(const char *pathname, int flags); 打开文件路径,打开方式 O_RDONLY, O_WRONLY, or O_RDWR.
文件不存在
int open(const char *pathname, int flags, mode_t mode);想创建的名字 打开方式 O_RDONLY, O_WRONLY, or O_RDWR.还要有一个参数O_CREAT 创建的文件指定一个访问权限 777
3)、返回值 返回一个新的文件描述符
45、open函数的errno
定义在头文件 errno.h中 全局变量,任何标准C库函数都能对其进行修改(Linux系统函数更可以)
错误宏定义位置 第1-34个错误定义/usr/include/asm-generic/errno-bash
第35-133个错误的定义:/usr/include/asm-generic/errno.h
每个errno值对应着以字符串表示的错误类型
void perror(String s)
perror 用来将上一个函数发生错误的原因输出到标准设备
参数s所指的字符串会先打印出来
46、read 和write函数
read:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t 是一个int型的数
-1 读文件失败
0 文件读完了
>0读到的字节数
write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
47、_lessk函数
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
off_t offset 文件指针偏移量
SEEK_SET 开始位置
The offset is set to offset bytes.
SEEK_CUR 当前位置
The offset is set to its current location plus offset bytes.
SEEK_END 尾部
获取文件长度:
int ret = lseek(fd,0,SEEK_END); ret就是文件的长度
文件拓展:
只能往后拓展
int ret = lseek(fd,2000,SEEK_END);拓展2000个
实现文件拓展还需要实现一步写的操作
write(fd,"a",1);
48、stat函数
参考链接:https://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html
49、一些系统文件函数介绍:
access测试一个文件拥有某种权限 int access(const char *pathname,int mode) ,mode标志 R_OK读权限 W_OK写权限 X_OK执行权限
Int ret = access(argv[1],W_OK)
chmod函数修改文件权限 int chmod (const char *path,mode_t mode);
int fchmod(int fd,mode_t mode)
int ret = chmod(argv[1],0755);
要把传进来的argv改成八进制数
用strtol来进行转换
long int strtol(const char *nptr, char **endptr, int base);
chown改变文件所有者,现在/etc/passwd 下面查看id
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);
int ret= chown(argv[1],116,125)
truncate函数 实现文件拓展
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
对文件进行截取
文件长度 100.第二个参数指定长度为20,后面的八十个就没了
对文件拓展
文件长度 100.第二个参数指定长度为300,就拓展了
link创建硬链接
int linkat(int olddirfd, const char *oldpath,
int newdirfd, const char *newpath, int flags);
symlink创建软连接
readlink用来读一个软连接
50、unlink 创建临时文件
unlink一个普通文件,如硬链接个数是0,就删除了
unlink一个文件就是删除一个文件的目录项,并减少它的连接数
int unlink(const char *pathname)
打开一个文件,再unlink就会不会删除文件,就会生成一个临时文件,当关闭的时候就会删除文件
int fd = open("tempfile",O_CREAT|O_ROWR,0664)
删除临时文件
int ret = unlink("tempfile")
但因为文件被open 无法删除,所以可以继续操作
write(fd,"hello",5);
lseek(fds,0,SEEK_SET)
char buf[24] = {0}
read = (fd,buf,sizeof(buf))
write(1,buf ,len )是写到屏幕上?? 1 标准输出 0 标注输入,2标准错误
51、目录操作函数
rename重命名
int rename(const char *oldpath, const char *newpath);
chdir修改文件当前进程的的路径 参数就是一个路径
getcwd获取当前进程工作目录
mkdir创建目录
opendir打开一个文件夹
opedir _ readdir
DIR *opendir(const char *name);判断返回值是否是空
readdir 文件类型文件名经常访问
struct dirent *readdir(DIR *dirp);
每读一个都会返回一个记录项
closedir关闭
52、递归目录获取文件个数
int getfileNum(char * root)
{
//对当前目录进行遍历
DIR *dir = NULL;
dir = opendir(root);
if(dir == NULL)
{
perror("opendir");
exit(-1)
}
//遍历当前打开目录
struct dirent *PTR= NULL;
char path[1024] = {0};
while(ptr = readdir(dir) ! = NULL)
{
//判断 过滤掉. h和 ..
if(strcmp(ptr->d_name,".")==0||strcmp(ptr->d_name,"..") == 0)
{
continue;
}
//如果是目录
if(ptr->d_type == DT_DIR)
{
// 递归 读目录
sprintf(path,"%s %s",root,ptr->d_name);
total += getFileNum(path);
}
//如果是普通文件
if(ptr->d_type == DT_REG)
{
total++;
}
}
closedir(dir);
return total;
}
int main(int argc,char * argv[])
{
int total;
total = get_file_count(argv[1]);
printf("%s has file numbers %d\n",argv[1],total);
return 0;
}
53、dup和dup2
文件描述符复制或分拣描述重定向
用完dup后一个文件可以对应两个文件描述符
int dup(int oldfd); 返回没有被占用的最小的文件描述符
int dup2(int oldfd, int newfd); old复制给new
new如果是被打开的 new会被打开
new和old同一个的话没影响,不会关掉new直接返回old
54、functl函数