=================================
2022-7-14
=================================
一.温故知新
1.编辑器
vim
命令模式
光标的定位
h j k l gg G 3G /string(n N)
文本的编辑
yy p P dd u ctrl+r r x D
模式的切换
iIoOaA
:
v
V
ctrl + v
编辑模式
文本的补齐
ctrl + p
命令行模式
w q wq q! wqa
3,6 s/srcname/destname/
g %
可视模式
代码格式的调整
可视行模式
可视块模式
块插入
块删除
块替换
替换模式
2.编译器
gcc->cc
a.out
gcc hello.c -o hello
gcc -Wall
3.用户管理
sudo useradd 用户名
sudo passwd 用户名
sudo userdel 用户名
-r
4.权限管理
基本权限和特殊权限
符号 数字 含义 对于普通文件的影响 对于目录文件的影响
r 4 可读 是否可以读取文件内容 是否可以列出子文件
w 2 可写 是否可以修改文件内容 是否可以创建或删除子文件
x 1 可执行 是否可以执行文件内容 是否可以访问该目录
二.文件的特殊权限
无论是suid sgid 还是 sticky,影响的都是可执行的权限
所以加入特殊的权限将来会出现在 x 的位置
suid u+s 4
sudo chmod u+s 文件名
如果文件本身的user权限中有x权限,那么u+s之后,s是小写的
如果文件本身的user权限中没有x权限,那么u+s之后,S是大写的
一般来说只会在可执行命令中加入u+s的权限
特性 : 拥有suid权限的命令,任何用户在使用这个命令时,
都会拥有这个命令的所有者的权限来执行
(简单来说就是在执行命令时,以命令所有者的权限来运行)
sgid g+s 2
sudo chmod g+s 文件名
如果文件本身的group权限中有x权限,那么g+s之后,s是小写的
如果文件本身的group权限中没有x权限,那么g+s之后,S是大写的
一般来说只会在目录文件中加入g+s的权限
特性 : 拥有sgid权限的目录,任何用户在该目录下创建的文件
都会继承该目录的属组
(无论是普通用户还是超级用户,在g+s的目录下创建文件都会修改属组)
sticky o+t 1
sudo chmod o+t 文件名
如果文件本身的other权限中有x权限,那么o+t之后,t是小写的
如果文件本身的other权限中没有x权限,那么o+t之后,T是大写的
一般来说只会在目录文件中加入o+t的权限
特性 : 拥有sticky权限的目录,当其他用户想要删除文件时,
只能删除自己创建的文件
(当超级用户进入到o+t权限的目录中,可以删除所有文件)
没有特殊权限 0
三.削减权限umask
当创建文件时,本身文件的权限过大,需要通过umask的值削减文件的权限
在终端中录入 umask 可以查看当前umask值
也可以修改umask数值 : umask 0022
修改的umask的数值越大,创建的文件的权限越小
在Linux系统中,默认创建的普通文件的权限是0666,
0666 - 0002 = 0664(rw-rw-r--)
在Linux系统中,默认创建的目录文件的权限是0777,
0777 - 0002 = 0775(rwxrwxr-x)
四.进程的简介
其实用户在操作系统中做的任何的操作都需要有进程的支持
进程 : 其实是一个程序运行时的一个过程
一个进程可以创建出多个子进程的
主进程 : 父进程
创建出的进程 : 子进程
可以调用函数 : fork()
僵尸进程 : 当父进程创建出子进程,子进程去工作,当子进程做完任务之后
父进程没有给子进程收尸,子进程会变成僵尸进程
孤儿进程 : 当父进程创建出子进程,子进程去工作,如果父进程提前结束了
没有人管理子进程,子进程会变成孤儿进程
程序运行----->主进程----->父进程-->等待子进程结束-收尸->程序结束
| |
fork() |
| |
子进程---->做工作----->结束(仆街)
ps //可以查看进程
ps -aux //查看所有进程信息
当系统启动之后首先会创建一个进程PID为1叫做初始进程(init)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER 运行该进程的用户
PID 进程ID号
%CPU CPU的占用百分比
%MEM 内存的占用百分比
VSZ 占用虚拟内存
RSS 占用实际内存
TTY 进程运行的终端
STAT 进程的状态
R 运行状态
s 进程组,下面会有子进程
S 睡眠状态(可以中断)
D 睡眠状态(不可中断)
Z 僵尸状态
X 死掉的进程
...
START 启动的时间
TIME 占用CPU的时间
COMMAND 进程名
============================================
./a.out
int max(int a, int b)
{
return a > b ? a : b;
}
int add(int a, int b)
{
return a + b;
}
int main(void)
{
add(13, 7);
max(13, 7);
return 0;
}
return 0; 函数正常运行
> 0 函数有异常
< 0 函数有错误
一个进程会有虚拟内存4Gb,实际上只占用了实际内存的4Kb
----------------------------
面试题
1.C语言的程序会把内存分为几个区?
5大区
(栈区 堆区 常量区 全局区 代码区)
char *p = "Hello World!";
static
----------------------------
1Gb Kernel(内核)
----------------------
3Gb 环境变量/命令行参数
栈区(从上往下分配)
空白空间
堆区(从下往上分配)
常量区(.RO<只读>)
全局区(.bss .data)
代码区(.text)
================================