当时复习了整整一周,可以说是写得最认真的笔记了,结果发现才两学分(然后没空复习数据库了)
文章目录
1.Linux命令基础
1.1 文件
①最大长度不超过256个字符,可以含有字母、数字、.、_、-,不能含有/
②通配符:*表示匹配0或多个字符;?表示匹配任何一个字符;[ab1A-F]表示匹配任何一个列举在集合中的字符。
1.2 路径
①绝对路径:从根目录开始的路径,以/开头,如/home/user/test
②相对路径:从当前目录开始的路径,不以/开头
.表示当前目录,..表示当前目录的父目录,/是根目录或路径中的分隔符
如./test/a.c
1.3 Linux命令
目录操作命令
$ ls [选项] [文件名/目录名] #查看目录及文件
$ ls -a #列出所有文件
$ ls -d #列出所有目录
$ ls -l #列出文件的详细信息
$ pwd #显示用户的当前工作目录
$ cd [目录名] #切换目录
#如果不输入目录名,即返回用户主目录
#如果目录名输入`-`即返回上一级
$ cd /home/downloads #例子
$ cd a #进入a目录
$ mkdir [参数] 目录名 #创建目录
$ rmdir [参数] 目录名 #删除目录
#删除目录时要保证目录内已无任何文件或目录,否则命令不成功
#参数-p表示递归删除目录或创建目录,例子如下
$ mkdir -p linux/doc/fedora #表示首先在当前目录下创建linux目录,然后在linux目录下创建doc目 #录。然后在doc目录下创建fedora目录
$ rmdir -p parent/child #删除parent目录下的child目录,如果删除之后parent目录也为空,那么 #将parent目录也删除
文件操作命令
$ cat [文件名称] #显示文本文件内容
$ cat file1 #显示file1的内容
$ cat file1 file2>file3 #把file1和file2的内容输入到file3中
$ cp [文件] [目的地] #拷贝文件
$ cp /root/* /temp #将root下的所有文件(不包括隐藏文件)拷贝到根目录下的temp内
$ mv [文件名1] [文件名或目录名] #文件更名或删除
$ rm [文件名] #删除文件
$ find [目录名] [选项] #搜索文件或目录
$ find . -name "*.c" #列举当前目录及其子目录下所有扩展文件名是'.c'的文件
#.是目录名,表示在当前目录下查找
#-name "*.c"是选项,-name表示根据文件名查找,"*.c"给出了文件名的格式
#选项还可以是-print表示将匹配文件输出到标准输出
#-size 表示根据文件大小查找
#-user 表示根据文件所有者查找
#-exec表示对匹配的文件执行该选项所给出的命令,命令格式为'command' {}\;例子如下
$ find .-name "*.c" -exec ls -l {
}\;
$ grep [字符串] [文件名] #在文件中查找字符串
$ grep tigger file1 #在file1中查找tigger字符串
$ grep -v -n printf 2.6.c
#-v表示在文件中查找不包含printf的行,-n表示将该行的行号显示出来
文件备份和压缩命令
$ tar cvf [打包的文件名] [要打包的文件]
$ tar cvf test.tar *.txt #将当前目录下所有txt文件打包为text.tar
$ gzip [选项] [文件目录列表] # 压缩命令
$ gunzip [选项] [压缩包包名] # 解压缩命令
# gzip压缩后不保留源文件
$ zip [-r] [压缩后的文件名称] 文件或目录 # 压缩
# -r表示压缩的是一个目录
$ unzip [选项] 压缩包包名 # 解压缩
# zip压缩后保留源文件
1.4 VI编辑器
启动:在终端输入命令vi或vim即可启动VI编辑器。
三种状态:命令模式、插入模式和可视模式。
命令模式:可以在VI编辑器下方输入命令,如保存、查找和替换。
插入模式:对文本内容进行插入、删除、添加操作。
可视模式(底行模式):提供了友好的选取文本范围并显示高亮的功能。
切换:
用 vi 打开文件后默认进入命令模式。在命令模式输入操作符i后进入插入模式,输入esc退出插入模式,返回命令模式;在命令模式下输入:或/进入底行模式,输入esc退出底行模式,返回命令模式。
命令模式下的命令:
:w 将文件内容保存到vi命令所指定的文件中
:w filename 将文件另存为filename
:wq! 将文件内容保存到vi命令所指定的文件中然后退出vi
:wq! filename 以filename为文件名保存后退出
:q! 不保存直接退出
:x 保存并退出,功能和:wq!相同
:q 退出命令,如果文件内容有更改,VI会提示需要保存才能退出
j k h l分别代表向下、上、左、右移动
通过插入命令可以由命令模式进入插入模式,如i a I A o都可以。
在命令模式下按v可以进入可视模式。
1.5 Linux命令行命令总结
# 路径
$ /home/user #绝对路径
$ ./test/h.c #相对路径
$ ../user/test/h.c #也可以写作从上一级目录开始的相对路径
# 文件操作命令
$ ls #查看当前目录下的所有文件
$ ls /home/user/test #查看指定目录下的所有文件
$ pwd #查看当前位置的绝对路径
$ mkdir #创建目录
$ cd /home/user/test #切换到指定目录
$ cd #切换到根目录
$ cd . #切换到上一级目录
$ cd .. #切换到上两级目录 ???cd -???
$ touch a.txt #创建文件
$ cp [源路径] [目的路径] #复制文件
$ mv [源路径] [目的路径] #移动文件
$ rm [目标路径] #删除文件或目录
$ rmdir [路径] #删除目录
# 要删除的目录必须为空,否则无法删除
# -r 递归删除,即可以删除指定目录及其子目录
# -f 强制删除,不管目录是否为空
# rm -rf [目标路径] 最强效的删除命令
$ cat ./test/h.c #查看文件内容
$ cat h.c | more #分页查看文件内容,但只能向前移动
$ cat h.c | less #加强版more,可以向后移动
$ head -n 10 h.c #查看前10行
$ tail -n 10 h.c #查看后10行
$ which [命令] #查看某一命令所在路径
$ find 搜索路径 [选项] 关键字
# -name按文件名查找
# -size按文件大小查找
# -user按文件所有者查找
$ locate #查找,功能类似find -name
# 压缩和解压缩命令
#--zip格式
$ gzip [选项] 文件
$ gunzip [选项] 压缩包名
#gzip压缩不保留源文件
$ zip [-r] [压缩后文件名称] 文件或目录
$ unzip [选项] 压缩包名
#压缩时保留源文件,[-r]表示压缩的是一个目录
#--tar格式
$ tar cvf tmp.tar.gz * # 打包,*表示当前目录下的所有文件
#如果选项中有-z则为压缩,如果没有就只是打包
$ tar -xvf tmp.tar.gz -C tmp #解压,-C表示命名解压后的目录
# 网络管理命令
$ ip addr
$ ifconfig # 查看IP地址
$ ping www.baidu.com #检查网络是否连通
#软件安装命令
$ wget [选项] [URL地址] #下载
$ sudo apt-get install package #安装
#vi编辑器的使用
$ vi filename #打开filename文件或创建一个名为filename的新文件
$ vi #创建一个新文件并打开,文件名在保存时指定
命令模式/插入模式/底行模式(可视模式)
命令模式:打开VI编辑器后默认进入
k 或 ↑
j 或 ↓
h 或 ←
l 或 →
b 光标移动到本单词的首字符
e 光标移动到本单词的尾字符
插入模式:在命令模式下输入i进入插入模式
底行模式:在命令模式下输入:或/进入底行模式
:set nu 设置行号
:set nonu 取消设置行号
yy复制当前行
p将复制的内容粘贴到当前字符的下一个位置
:n 移动光标到第n行
删除当前字符:x
删除当前行:dd
删除当前行在内的n行:ndd
/查找的关键词 #查找指定内容,n 下一个,N 上一个
:s/被替换内容/替换内容/ #替换当前行的第一个目标
:s/被替换内容/替换内容/g #替换当前行的全部目标
:%s/被替换内容/替换内容/g #替换整个文档的全部目标
:%s/被替换内容/替换内容/gc #替换整个文档的全部目标,替换每个 #内容时都询问
:wq #保存并退出
:wq[filename] #保存为filename并退出
:q #退出
:q! #强制退出
:w testfile2 #另存为filename2
补充:
# 用命令找出当前目录下的空目录
$ find -type d -empty
# -type d 指的是查找的是目录
1.6 POSIX标准和LSB标准
POSIX 表示可移植操作系统接口,定义了操作系统应该为应用程序提供的接口标准,是 IEEE 为要在各种 UNIX 操作系统上运行软件而定义的一系列 API 标准的总称。 POSIX 并不局限于 Unix 系统,Microsoft windows NT 等也支持 POSIX 标准。
LSB 是 Linux 标准化领域中事实上的标准,使各种软件可以很好地在兼容 LSB 标准的系统上运行。 LSB 以 POSIX 和 SUS 标准为基础,还增加了对二进制可执行文件格式规范的定义,保证 Linux 上应用程序源码和二进制文件的兼容性。
2.GCC/GDB/Makefile
2.1 GCC
GCC相关命令
gcc test.c无选项编译链接,作用将 test.c 预处理、编译、汇编并链接形成可执行文件。这里未指定输出文件,默认输出为 a.out。
GCC将一个源程序转换为可执行文件的步骤:源文件->预处理->编译->汇编->链接->可执行文件
-o指定输出的可执行文件的名字
-E预处理选项,gcc -E test.c -o test.i将test.c预处理为test.i文件
-S编译选项,gcc -S test.i将test.i文件编译成test.s文件
-c汇编选项,gcc -c test.s将test.s文件编译成test.o二进制文件
gcc test.o将test.o链接生成可执行文件test
gcc -E test.c -o test.i #预处理
gcc -S test.c -o test.s #编译
gcc -c test.s -o test.o #汇编
gcc test.o -o test #生成可执行文件
2.2 GDB调试器
在用gcc编译程序时,加上-g参数,这样产生的可执行文件具有调试信息,才能使用GDB进行调试。
进入GDB模式:
GDB [可执行程序名称]
先输入GDB进入调试模式,再输入file [filename]加载需要调试的程序,最后用run或r命令开始执行,也可以用run parameter的方式传递参数。
退出GDB:输入quit或者按Ctrl+D
GDB命令
l #显示多行源代码
break/b [函数名/行号] #设置断点
i #描述程序的运行状态
r #开始运行程序
disp [变量名] #跟踪查看某个变量,每次停下来都显示它的值
s #执行下一条语句,遇到函数则进入函数执行该函数的第一条语句
next #执行下一条语句,不进入函数
print/p [变量名] #打印变量值
c #继续执行程序直到遇到下一个断点
set var #设置变量的值
start #开始执行程序,在main函数第一条语句前面停下
file #装入需要调试的文件
kill/k #终止正在调试的程序
watch #监视变量值的变化
backtrace/bt #查看函数调用的信息
info locals #查看所有局部变量的值
frame/f #查看栈帧
quit/q #退出GDB环境
2.3 Make工具与Makefile
安排系统先编译哪个再编译哪个,叫做构建(build)。Make工具是最常用的构建工具,使用Make工具构建程序时,构建规则被写在一个叫做Makefile的文件中。
- 一是通过输入的指令,比如 make test,则会根据 test 的依赖关系进行迭代生成
- 二是当发现待生成的文件已经存在时,会判断其依赖项是否发生了更新,如果没有更新则不再重复生成
2.4 静态库与动态库
静态库:命名方式为libxxx.a,以lib开头,.a结尾,xxx是静态库文件的文件名
动态库:命名方式为libxxx.so,以lib开头,.so结尾,xxx是动态库文件的文件名
区别
静态库的代码是在编译过程中被载⼊程序中;动态库在编译的时候并没有被编译进⽬标代码,⽽是当你的程序执⾏到相关函数时才调⽤该函数库⾥的相应函数。
因此,对于相同的程序,使用静态库生成的可执行文件要比使用动态库的内存开销大。
如果所使⽤的静态库发⽣更新改变,你的程序必须重新编译;动态库的改变并不影响你的程序,动态函数库升级⽐较⽅便。
静态库和程序链接有关和程序运行无关;动态库和程序链接⽆关和程序运⾏有关。
如果链接完之后删掉静态库,程序仍然能正常运行,如果删掉动态库源文件,程序就不能正常运行了。
链接方法
生成静态库文件(将mytool1.c和mytool2.c这两个文件编译,并用生成的目标文件mytool1.o和mytool2.o创建生成libmylib.a静态库)
gcc -c mytool1.c -o mytool1.o
gcc -c mytool2.c -o mytool2.o
ar cr libmylib.a mytool2.o mytool1.o
链接静态库(首先将main.c编译生成了可执行文件main,同时在编译的时候链接静态库libmylib.a)
gcc -o main main.c -L. -lmylib
生成动态库文件(将mytool1.c和mytool2.c这两个文件编译,并用生成的目标文件mytool1.o和mytool2.o创建生成libmylib.so动态库)
gcc -c -fPIC mytool2.c -o mytool2.o
gcc -c -fPIC mytool1.c -o mytool1.o
gcc -shared -o libmylib.so mytool2.o mytool1.o
链接同上gcc -o main main.c -L. -lmylib
可能出现的简述题:静态库和动态库的区别(命名方式,文件大小,载入的时间,删除后还能不能正常使用,链接方式)
3.Shell编程
3.1 Linux权限
3.1.1 rwx权限
当在命令行输入ls -l时,Linux系统会列出目录下文件的详细信息。
第一个字段就是文件权限
如drwxrwxr-x
第一个字符表示文件的类型:
-表示普通文件,d表示目录,l表示链接文件等
其余九个字符表示这个文件的详细权限,三个字符为一组 ,总共有三组,分别代表了拥有者,拥有组,其他人对这个文件的权限。
r表示读权限,w表示写权限,x表示执行权限
x代码为1,w代码为2,r代码为4。故7表示rwx,6表示rw-,等等。
3.1.2 Linux用户
Linux的用户分为管理员和普通用户,普通用户又分为系统用户和自定义用户,用户信息可以在/etc/passwd中查看。
· 管理员/root账户:拥有所有系统权限
· 系统用户:Linux系统为满足自身管理所内建的账号
· 自定义用户:由root管理员创建的用户
Linux中每个用户必须属于一个用户组,用户组信息可以在/etc/group/中查看。
su # 切换到root用户
sudo + 指令 # 使本条指令以最高权限运行
chmod [权限代码] 文件名 # 更改文件权限
useradd -g 所属组名 用户名 # 添加用户
groupadd 组名 # 添加组
chown [选项] 用户名 文件名 #更改文件所有者
chgrp [选项] 组名 文件名 # 更改文件所属组
passwd [选项] 用户名 #为用户设置密码
userdel/groupdel [选项] 用户名/组名 #删除用户/组
exit #退出root用户
3.2 重定向
3.2.1 标准输入输出
Linux中默认的标准输入输出分为三个文件:
标准输入stdin,文件号是0
标准输出stdout,文件号为1
标准错误stderr,文件号为2
(所以分配其他文件的文件号时从3开始)
3.2.2 重定向
重定向的格式:命令 [输入输出流向符号] 文件名
输入重定向:命令 < 文件名
输出重定向:命令 > 文件名
追加重定向:命令 >> 文件名
错误重定向:命令 2 > 文件名
- 比如:
gcc -c test.c -o test.out 2> error.log。当执行gcc编译出现错误时,不会输出到屏幕上,而是输出到error.log中
&运算符:等同于2>&1,表示将标准错误重定向到标准输出指向的文件
3.3 管道
将左边命令的输出作为右边命令的输入
比如ls /etc | grep init,grep的作用查找字符串中是否包含某字符串,这个管道命令的意思是查找/etc目录下文件名包含init的文件/目录
例题:请写出命令who | wc -l的结果并分析其执行过程。
1;因为who命令用于显示系统中的使用者有多少,who输出了1行,wc命令用于输出行数,将who命令的输出作为wc命令的输入,则结果为1.
3.4 环境变量
3.4.1 短期设置环境变量(在进程中,退出Terminal消失)
export [环境变量名]=[值]
如:
export system_programming=cool
查看环境变量:
echo $system_programming
3.4.2 永久设置环境变量
修改~/.bashrc文件(.表示该文件是隐藏文件,要用ls -a才能看见)。
用gedit ~/.bashrc打开~/.bashrc文件,在末尾加上export STUDENT_ID="19373178",保存退出。
再用echo $STUDENT_ID查看即可看到环境变量的值
这种方法修改的环境变量只有当前用户能读取到
如果想修改结果让所有用户都能读取到,可以将export语句写到/etc/profile文件
3.4.3 C语言程序获取环境变量
获取所有环境变量
#include<stdio.h>
extern char** environ;
int main()
{
char **p = environ;
for(; *p != NULL; p++)
printf("%s\n", *p);
return 0;
}
获取指定环境变量
#include<stdio.h>
#include<stdlib.h>
int main()
{
const char* envName = "envName";
printf("$envName=%s\n", getenv(envName));
return 0;
}
3.4.4 path环境变量
存储系统默认的查找可执行文件的路径,是多个路径用:连接起来的,比如:
/usr/local/sbin:/usr/local/games:/snap/bin
3.5 shell编程
bash是最常用的一种shell
#! /bin/bash
echo 'Linux is cool!'
3.5.0 shebang
#!是shebang符号,表示用什么命令来执行该文件,比如.sh文件,由于开头用了shebang,因此在命令行直接输入文件名系统就知道应该用什么方法来解释该文件。
如果开头的shebang改为#! /bin/rm,则系统只会用rm来解释该文件,即文件一运行就会被删除。
如果开头的shebang改为#! /bin/more,则系统只会用more来解释该文件,即运行文件会将文件打印在终端上。
执行bash脚本命令
chmod 764 test.sh #或 chmod +x test.sh
test.sh #或 ./test.sh
3.5.1 特殊字符
转义字符/:当希望使用特殊字符的字面义时
单引号'':单引号所包含的所有字符保持字面意义(单引号不能嵌套)
双引号"":使除了$ / `之外的其他所有字符保持字面义,意思是:
$ 和`两个字符保持特殊含义
而转义字符/只有后面跟的是$ `` " 或换行符的时候才有转义的特殊作用
string=hello
echo $string #输出hello
echo '$string' #输出$string
echo "$string" #输出hello
echo "\string" #输出\string
echo "\$string" #输出$string,$在/的作用下失去特殊含义
命令替换符``或$():在shell编程中,用该命令的执行结果替换该命令
命令连接符&&和||语义同C语言
3.5.2 变量
Shell用户变量:使用时无需创建,不分类型,统一认为是字符串,需要的时候进行类型转换。采用$变量名或${变量名}的方式使用。
Shell环境变量
Shell内部变量
# 参数数量
* 所有参数
输出方式:echo $*
当*在双引号中时,即"$*"时,字符串扩列为"$1c$2c…",其中c为IFS变量值的第一个字符
? 上一条命令的执行返回值
! 最后一条命令的进程号
$ 当前的进程号
0 当前执行的shell程序的名称
@ 所有参数,"$@"被扩列为"$1"、"$2"、……
_ shell程序启动时为正在执行的shell程序的绝对路径,之后为上一条命令的最后一个参数
shell变量的参数扩展
变量=${parameter:-word}:如果parameter未定义或为null<

本文深入探讨了Linux与Unix系统编程,涵盖了命令基础,如文件操作、路径管理、Linux命令行总结;讲解了进程管理,包括进程创建、退出状态、守护进程;详细阐述了文件I/O操作,如标准文件IO、静态库与动态库、错误处理函数;并介绍了shell编程,包括重定向、管道、环境变量管理。此外,还涉及到了GCC/GDB/Makefile的使用,以及信号处理和进程间通信的基础知识。
最低0.47元/天 解锁文章
1615

被折叠的 条评论
为什么被折叠?



