Linux c高级
Posted 子羽丿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux c高级相关的知识,希望对你有一定的参考价值。
统一声明:
博客转载 声 明 : 本博客部分内容来源于网络、书籍、及各类手册。
内容宗旨为方便查询、总结备份、开源分享。
部分转载内容均有注明出处,如有侵权请联系博客告知并删除,谢谢!
百度云盘提取码:统一提取码:ziyu
一、Linux
1.1、嵌入式
嵌入式:计算机应用为中心、软硬件可裁剪的系统。
1.2、什么是Linux
- Linux 多任务、分时 的一个操作系统
- GNU GNU is Not Unix 它是一个组织;
- GPL 是一种协议。
1.3、Linux发行版
- Linux本身指的是一个操作系统内核,只有内核是无法使用的。
- 我们系统使用操作系统一个包含内核和一批有用的应用集合,这就叫Linux发行版。
Ubuntu、Redhat就是Linux的不同的发行版。 - Red Hat 服务器
- unbutu 桌面性能好 “人道主义”。
- debian
1.4、Linux体系结构
-------------------------------------------- [0-3G] 0XC000 0000
应用层
app程序、shell命令、shell脚本、程序
| |
| |
| |
内核层---------------------------系统调用--- [3-4G] 0xffff ffff(代表4G) 1 0000 0000
文件管理
内存管理
进程管理 --> 程序的一次执行过程
硬件管理
网络管理
--------------------------------------------
硬件层
LED LCD CAMERA 鼠标 键盘
1.5、虚拟4G内存
------------- 4G
内核
------------- 3G
栈区 自动开辟自动释放
-------------
堆区 手动malloc
-------------
静态区/数据区 全局/静态
-------------
字符串常量
-------------
代码段
------------- 0
1.6、shell 命令
whoami 我是谁
ls
-a
-l
-r 递归查询
-i inode 一个编号,一种节点
-lh
pwd
cd
cd dir_name
cd 路径 绝对路径 相对路径
cd ~ 返回目录
cd
cd .
cd ..
cd - 返回上一步
mkdir
-p 递归创建
rm mkdir dir_name 删除空目录
rm -r dir_name
touch file_name
rm file_name
cp
cp 路径 路径 复制文件
cp -r
-a 目录的复制
mv
mv 路径 路径
exit 退出
echo 输出
su 切换用户
sudo 权限
clear 清屏 快捷键:Ctrl+L
1.7、软件包的管理
1.7.1、dpkg:(离线安装)
rxvt _1%3a2.6.4-14 _i386 .deb
| |
| | 32
| |
软件名 主版本号 修订版本号 体系结构 后缀
软件包安装:
sudo dpkg -i 软件包全称
卸载:
sudo dpkg -r 软件名
清除软件包的配置文件:
sudo dpkg -p 软件名
列举软件的相关信息的清单:
sudo dpkg -L 软件名
查询版本号:
sudo dpkg -l 软件名
查询软件安装包的状态:
sudo dpkg -s 软件名
强制安装:
sudo dpkg -f 软件名
虚拟机自定义伸缩窗口大小
虚拟机 --> 首选项 --> 显示;
更新 vmare tools
点击 虚拟机—> 更新(重装) VMware tools
跳转到一个界面,界面上有VMwareTools-10.3.10-13959562.tar.gz 这个压缩包,
把这个安装包解压在家目录 tar -xvf VMwareTools-10.3.10-13959562.tar.gz (一直按enter键直到结束)
结束后生成一个目录–vmware_tools_distrib, cd 进去这个目录,再执行 ./vmare_install.pl 这个可执行文件就可以了;
1.7.2、把windows的文件复制到Ubuntu中
(1)、拖拽的方式:
直接把文件拖到终端,在前面加上 mv 移动到某一个路径(mv ‘/tmp/VMwareDnD/VUayTT/char_arr.c’ ./my.c)
或者在widows上,鼠标右键点击复制,再转到ubuntu上的终端上点击 右键—> paste filenames 也会有一个路径,同样
在前面加上 mv 移动到当前; ( mv ‘/tmp/VMwareDnD/VUayTT/char_arr.c’ ./)
(2)、创建共享文件夹
虚拟机 -> 设置 -> 选项 -> 共享文件夹 -> 总是启用 ->选择一个windows中的一个文件夹作为共享文件夹
终端访问: cd /mnt/hgfs/myshare
共享文件夹设置失败解决问题:属性,设置兼容性;虚拟机关键。
1.8、图形界面配置配网
1.8.1、编辑 --> 网络编辑器 --> 更改设置 --> 桥接模式 -->选择对应网卡 -->
虚拟机 --> 设置 --> 桥接模式。
网络图标: --> edit conections --> 自动 / 静态
ip:192.168.9.123
子网掩码:255.255.255.0
网关: 192.168.9.1
相关命令: ifconfig 查看当前ip地址
ctrl+c 结束当前进程
ping + ip地址 连接某个ip
1.8.2、apt 需要外网
软件源:
/ect/apt/sources.list
下载的路径:
/var/cache/apt/archives/
更新源:
sudo apt-get update
下载一个软件:
sudo apt install 软件名:
卸载:
sudo apt-get remove 软件名
清空:
sudo apt-get clean 软件名
下载源码:
sudo apt-get source 软件名
1.9、文件的压缩和归档
1.9.1、压缩
针对的是文件
实质:
把文件里的tab/空格等压缩。
压缩的时候,原文件就没有了,生成了压缩文件;
解压的时候压缩文件也变成了原文件;
速率 大小
.gz: 最慢 最小
gzip 1.c --> 1.c.gz
.bz2: 次之 次之
bzip2 1.c --> 1.c.bgz2
.xz 最快 最大
xz 1.c --> 1.c.xz
1.9.2、解压
gunzip 1.c.gz --> 1.c
bunzip 1.c.bz2 --> 1.c
unxz 1.c.xz --> 1.c
1.9.3、归档
归档:针对的是一个目录 “把一个目录变成一个文件”
归档的时候源文件依旧存在,生成一个新的归档文件。
释放的时候,压缩文件也存在。
tar 参数 归档的文件 目录
c 创建归档
v 显示过程
f 后面接文件
x 释放后归档的文件还在
z: 压缩成gzip
j: 压缩成bzip2
J: 压缩成xz
eg:压缩
tar -cvf test.tar test --> test.tar
释放:
tar -xvf test.tar --> test
1.9.4、压缩的实质就是归档并压缩
压缩:
tar - vzcf day1.tar.tar.gz day1 --> day1.tar.gz
解压:
tar - xzvf day1.tar.tar.gz
万能解压:
tar -xvf test.tar.* (* 代表各种格式的压缩包)。
1.10、文件相关的内容
1.10.1、vi 三种模式
新建文件 vi toch
(1)、命令行模式
复制:nyy
粘贴:p
剪切:ndd
撤销:u
返向撤销:Ctrl + r
查找:
/string 向下查找n 向上查找N
/^string 查找以string开头的字符串
去光标移到到结尾: G
光标移到到开头: g
调整格式:gg=G
(2)、插入模式
a / i / b
(3)、底行模式
w
q
wq
q!
wq!
x
:num 去到某一行
srtnumer:设置行号
vsp
替换:
.当前
$最后
g所有
%全文
s/str1/sre2/g 替换
范围:s/str1/sre2/g
.,$ s/str1/sre2/g
% s/str1/sre2/g
块复制:
: 1,3 y --> 复制 1~3行
1.10.2、查看文件
cat head tail nore less(不要)
cat 文件名 //查看文件
cat -n 文件名 //连同行号一起查看
head -n 文件名 //查看前n行
head -5 文件名 //查看前5行
tail -n 文件名 //查看后n行
tail -1 文件名 //查看最后1行
1.10.3、> 重定向
cat 1.c > 2.c //把1.c里面的内容放到2.c里面,相当于复制
diff 比较一个文件一不一样,若没有输出内容,文件内容就一样;
>> 追加
cat 1.c >> 2.c //把1.c里面的内容追加到2.c
| 管道:把前面的结果作为后面的输入。
“|”是管道命令操作符,简称管道符。
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。
连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
练习:把一个文件的第5行输出到终端上。
①
head -5 /etc/passwd > 1.c
tail -l 1.c
②
head -5 /etc/passwd | tail -l
1.10.4、grep 搜索
grep “string” 参数 文件
参数:
-n 行号
-R 递归搜索
-i 不区分大小写
-w 精确查找,字符串前后如果有内容就查询不到;
grep "include" -n 4.linux_高阶进阶.c
1.11、find
find 路径 -name 文件名
1.12、cut
cut -d : -f 1,2 filename
/etc/passwd
farsight: x :1000:1000:ubuntu,,,: /home/farsight: /bin/bash
用户名 密码 uid gid 描述 主目录
练习:
查一下当前用户
用户名:UID:GID
head -34 /etc/passwd | tail -1 | cut -d : -f 1,3,4
查一下当前用户行号
cat /etc/passwd | grep "farsight" -n | cut -d : -f 1
1.13、修改文件的权限、用户、组。
ls -l
-rw-rw-r-- 1 farsight farsight 18672 6月 15 08:48 4.linux_高阶进阶.c
权限 链接数 用户 组
-:
文件的类型 bcd-lsp
rw-:用户的权限 u
rw-:组的权限 g
r--:其他权限 o
所有权限: ugo 或者 a
ls -l 列出属性
drwxr-xr-x
一个10个字符。第一个字符表示文件类型,后面9个字符表示文件权限。
rwx:r(可读)、w(可写)、x(可执行)。
第一组:表示文件属主权限。
第二组:表示属主所在的组用户的权限。
第三组:表示其他用户的权限。
r:4 w:2 x:1 最高权限:777
r 可读 4
w 可写 2
x 可执行 1
- 无权限 0
有了这个编码规则,则drwxr-xr-x 编码后为755
三个为一组: 7 5 5
(1)修改权限:
第一种修改权限的方法 ***
要把 drwxr--r-- 则对应的编码为744
修改命令:chmod 744 文件名
第二种修改权限的方法:
在原来的权限基础上修改,即增加或减少某权限。
三个组用户的编码依次为:属主u 属主所在的组g 其他用户o
如属主增加可执行权限 chmod u+x 文件名
其他用户增加可写权限 chmod o+w 文件名
属主所在组用户去掉可执行权限 chmod g+x 文件名
chmod 777 2.c 赋最高权限
ls -l 2.c
-rwxrwxrwx 1 farsight farsight 431 6月 16 09:24 2.c
chmod u-x 2.c
ls -l 2.c
-rw-rwxrwx 1 farsight farsight 431 6月 16 09:24 2.c
chmod g-x 2.c
ls -l 2.c
-rw-rw-rwx 1 farsight farsight 431 6月 16 09:24 2.c
chmod o-w-x 2.c
ls -l 2.c
-rw-rw-r-- 1 farsight farsight 431 6月 16 09:24 2.c
(2)修改用户:
chown
sudo chown 用户名 文件 修改文件所属的用户
sudo chown 用户名:组名 修改文件用户和组
chgrp
sudo chgrp root 2.c 修改文件的组
1.14、软链接与硬链接
1.14.1、软链接:相当于windows的快捷方式
创建软连接文件:ln -s 源文件名 符号连接文件名
reg:ln -s src.c linker.c linker.c就是src.c的一个符号连接文件
ln -s 源文件 链接文件
ln -s a.out app
结论:
(1)app 相当于a.out 的快捷方式;
(2)app 是一个链接文件, a.out 是普通文件;
(3)a.out 的链接数不变;
(4)把源文件删除或者移动到其他路径,链接文件就不可以用了;
(5) 用绝对路径创建软链接,把链接文件移动到其他路径是可以用的;
eg:
ls -n /home/farsight/210501/day1/day1/a.out app
ls -l app
lrwxrwxrwx 1 farsight farsight 37 6月 16 14:05 app -> /home/farsight/210501/day1/day1/a.out
1.14.2、硬连接:对文件起别名
ln 源文件名 连接文件
硬连接实际上和源文件在硬盘中是同一个东西,效果类似于硬盘上的一个文件。
结论:
(1)链接数变了
(2)两个文件的iNode号是一样的
(3)硬链接的文件可有移动1到其他路径下使用
(4)硬链接文件是一个普通文件
1.15、通配符
* : 匹配所有字符
? : 匹配一个字符
[]:
[字符1字符2] 匹配字符1和字符2中的任意一个字符,不能同时匹配两个字符;[1234] == [1,2,3,4]
ls name[12].c
[字符1 - 字符2] 匹配到从字符1 至 字符2 的所有字符
ls name[A-F].c
如果出问题,清除本地化设置
export LC_ALL = C
还原:
unset LC_ALL
{}:touch name{1,2,3,4,5}.c 同时创建多个文件;
1.16、进程
程序的一次执行过程
ps
ps -aux
ps -aux | grep a.out 查询a.out这个进程
top 动态检测进程
kill 4797 //kill 进程号 --> 杀死一个进程
1.17、man 查询函数、库函数、命令的用法
man -a 查询所有
man 1 ls 1.表示查询的是Linux命令
man 2 xx 2.表示查询的是Linux api 系统调用
man 3 xx 3.表示查询的是Linux库函数
1.18、用户管理
1.18.1、添加用户
adduser 用户名
/etc/skel 模板文件
/etc/passwd 用户信息
/etc/group 组的信息
1.18.2、切换用户
su 用户名
新用户用不了sudo
解决:
sudo su root //进入root用户
chmod u+w /etc/sudoers //修改可执行权限
sudo vi /etc/sudoers //进入权限为普通用户修改
添加:
test ALL = (ALL:ALL) ALL //添加普通用户
chmod u-w /etc/sudoers //把权限修改回来
1.18.3、删除用户
deluser 用户名
1.18.4、关机和重启
sudo shutdown -h now 立即关机
sudo shutdown -h 16:00 关机
init 0 关机
sudo shutdown -r now 立即重启
sudo reboot 重启
1.18.5、usermod
sudo usermod -aG farsight mytest 把mytest这个用户追加到farsight这个组里;
用 id 用户名 可以看到效果: id mytest
sudo usermod -c hello mytest 把mytest这个用户的第五个描述修改为hello;
sudo usermod -d /home/farsight mytest 把mytest 这个用户的家目录改为 /home/farsiht
sudo usermod -g farsight mytest 把mytest这个用户的组改为 farsight
id mytest
uid=1003(mytest) gid=1000(farsight) groups=1000(farsight)
sudo usermod -l test1 mytest 把mytest这个用户名改为test1
注意:不要在用户登录的时候修改信息。若果还是报错,把当前终端退出, (exit)
1.18.6、修改密码
sudo passwd user1 为名为user的用户设置密码
1.19、磁盘相关的命令
1.19.1、查看磁盘的相关信息
sudo fdisk -l
/dev/sda: 系统盘 --> Disk /dev/sda: 21.5 GB, 21474836480 bytes
1.19.2、查看磁盘分区信息
df -h
1.19.3、将U盘挂载在Ubuntu上: USB/2.0 3.0
虚拟机 -> 可移动设备 -> flush disk
在家目录创建:mkdir ~/udisk
挂载: sudo mount /dev/sdb1 ~/udisk
就可以进入到udisk中访问u盘:
取消挂载:
sudo umout /dev/sda1 ~/udisk
1.20、网络知识
域名解析服务器:
8.8.8.8
114.114.114.114.114
自己的ip地址: 192.168.6.81
sudo vi /etc/network/interfaces 打开配置文件
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp //两个字符串之间是tab键的距离
sudo /etc/init.d/networking restart 让配置文件生效
如果没有图标:
sudo vi /etc/NetworkManager/NetworkManager.conf
2 [main]
3 plugins=ifupdown,keyfile
4 dns=dnsmasq
5
6 no-auto-default=00:0C:29:A4:5E:47,00:0C:29:85:E8:39,00:0C:29:02:7A:D6,
7
8 [ifupdown]
9 managed=true //把false 改成 true
1.21、环境变量
env 查看环境变量
查看单个环境变量:
echo $PATH
PATH 它是用来保存系统可执行程序路径的变量
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/farsight/OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin:/home/farsight/gcc-4.6.4/bin
echo $HOME 主目录
如何使得a.out可以直接使用:
①只针对当前终端有效。
export PATH=${PATH}:./
export 导入环境变量
PATH 环境变量
= 赋值
${PATH} 引用环境变量path 里的内容
: 起到分割的作用
./ 把当前路径加上去
②在当前用户下生效
vi .bashrc 打开
在最后的位置添加:
//export PATH=${PATH}:./
//export PATH=${PATH}:./home/farsight 在主目录下生效
③在所有文件下省效
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/game
s:/home/farsight/OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/
toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin:/home/farsight"
source /etc/environment //让过程更改的环境变量生效
或者 sudo reboot 重启;
二、shell
2.1、实质:shell命令的有序集合
把shell脚本放在一个文件中,那么这个文件就是shell脚本
2.2、shell命令行解释器
sh
csh
ksh
bash --> ubuntu
2.3、shell脚本
2.3.1、后缀为.sh
eg:(1)在家目录创建一个目录 mydir
(2)把 /etc/passwd 和 /etc/groff 复制到mydir
(3)压缩并归档位mydir.tar.gz
eg:#!/bin/bash
cd
mkdir mydir
cp /etc/passwd ./mydir
cp -a /etc/groff ./mydir
tar -cvzf mydir.tar.gz mydir
2.3.2、shell脚本为解释器语言,不需要编译
2.3.3、运行
(1)创建脚本 :vi demo.sh
在开头加上:#!/bin/bash
(2)修改权限:
chmod 777 demo.sh 修改为可执行的文件
(3)执行脚本
./demo.sh
bash demo.sh
source demo.sh
三种运行方式的区别:
(1)./执行的时候需要赋上可执行的权限,后两者可以直接执行;
(2)./和bash在执行的时候会新开一个字终端,最后把结果直接返回给终端。
(3)source 执行的时候在当前终端执行,一般用来让某个脚本生效;
2.4、shell脚本的变量
2.4.1、变量的定义
没有数据类型,不需要提前定义直接使用;
给变量赋值的时候等号左右不能有空格
每一行语句不需要加‘;’
变量名见名知意;
赋值给变量都默认为字符串;
2.4.2、变量的引用
$var
$(var)
2.4.3、在给吧变量赋值的时候可以加双引号和单引号,也可以不加:
单引号和双引号的区别:
单引号和双引号内都可以加空格;
单引号里面不能引用变量
给变量赋值的时候不需要加上 $
var=10
var=11; // 再次赋值
eg:#!/bin/bash
a=22
b="open book"
c="$a open"
echo $a
echo $b
echo $c
输出:
22
open book
22 open
单行注释: #
多行注释: :<<EOF
被注释的内容
EOF
或者
:<<!
被注释的内容
!
2.4.4、删除变量:变量被删除后不能再次使用
unset var1
eg:myur1="www.baidu.com"
unset myur1
echo $myur1
输出:
//空格
2.4.5、命令置换
把命令赋值给了一个变量
var=`ls`
或者
var=$(ls) //不输出不会执行
eg:
var=`ls`
var1=$(ls)
echo $var
echo $var1
2.4.6、位置变量
$0 $1 $2 $3…
$# $* $@ $$
$0 用./ 和 bash执行 代表shell脚本文件名,用source执行代表bash
$1 shell脚本文件名后面第一个参数
$2 shell脚本文件后面第二个参数
$* 和 $@ 表示shell文件名后面的所有参数,不包含文件名
$# 表示shell文件名后面所有的参数,不包含文件名
$$ 表示进程号
练习:
用一个变量1保存PATH, 变量2保存HOME, ----> 交换;
var1=${PATH}
var2=${HOME}
echo var1: $var1
echo var2: $var2
var3=$var1
var1=$var2
var2=$var3
echo var1: $var1
echo var2: $var2
2.4.7、shell处理字符串
(1)、字符串的复制
str=hello
strl=$str
eg:#!/bin/bash
str=hello
str1=$str
echo $str
echo $str1
输出: hello
hello
(2)、字符串的连接
str=hello
st以上是关于Linux c高级的主要内容,如果未能解决你的问题,请参考以下文章
Vue3官网-高级指南(十七)响应式计算`computed`和侦听`watchEffect`(onTrackonTriggeronInvalidate副作用的刷新时机`watch` pre)(代码片段