LinuxC++开发面试系列:目录结构与文件权限
Posted 我是管小亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinuxC++开发面试系列:目录结构与文件权限相关的知识,希望对你有一定的参考价值。
文章目录
同步GitHub在此 👉 https://github.com/TeFuirnever/GXL-Skill-Tree
Linux介绍
Linux 是在计算机上面运行的,那么它是一组软件还是一段程序?又或者它是操作系统或者应用程序?又或者它是在计算机软件上运行还是在计算机硬件上运行?Linux和Windows谁厉害?
来看一张很有意思的图,Linux 在喝 Windows 。。。哈哈
众所周知,计算机主机是由一堆硬件所组成的,那么如何有效地控制这些硬件资源呢,计算机需要一个资源分配管理员,所以就有了操作系统这个概念。除了分配资源之外,还提供计算机运行所需功能,更是为工程师提供了更易开发的环境和接口。
到这里了,你大概就知道了,
Linux 就是【操作系统】,即【核心】与【系统呼叫】这两层,也就是【硬件】与【应用程式】中间的部分。
摘自《鸟哥的Linux私房菜-基础篇》第四版
从上图可以看出,核心与硬件的关系密切,但是由于早期的 Linux 是针对 386 开发的,所以只是操作系统而不具备其他的应用程序,因此你还需要在 Linux 基础上安装你所需要的软件。那么它和我们知道的 Windows 是一样的嘛,可以在不同的电脑上运行?
不同种类的操作系统具有自己的核心,而硬件是由核心控制的,所以需要修改操作系统的源码才能进行【软件移植】。
Linux与Windows
那么 Linux 与 Windows 谁厉害呢?
优缺点如下:
- 首先,个人感觉 UI 界面上 Windows 要比 Linux 更优美一些;
- 然后,Linux 软件都是【开源】的,Windows 上有免费的但很多是需要授权的;
- 接着,Linux通常通过命令行来执行相关操作,Windows 可以直接打开图形界面;
- 其次,Linux 不用补丁,并且由于其开源的特性,维护安全方面有保证,Windows 则需要经常打补丁;
- 最后,两种系统都可以提供给普通用户和商用服务器进行使用。
使用者与群组和其他人
1)文件拥有者
对于首次接触 Linux 的朋友来说,大改会觉得奇怪,为什么有这么多使用者,分什么拥有者,群组还有其他人之类的,有什么用?
其实这是一种相当健全且好用的安全防护功能,可以在最大程度上尊重每个人的隐私权,并且根据每个人的喜好进行工作环境的个性化。让我用一个例子来说明这其中的关系。
假设你和自己的女票写了情书,可能是微信,可能是email,现在你想把这个情书打印或者转存成文件,放在自己家里的电脑里,但是你并不希望其他人看到这个情书。
所以你把这个文件设置成只有你才能查看和编辑,其他人只会知道这是一个有趣或者秘密的文件。
2)群组
那么群组呢?其实群组也是最有用的功能之一,尤其是当你在团队开发时。一方面,你需要开放一些资源给团队的成员使用;另一个方面,你不能开放所有资源给团队成员使用。
举个例子,你的情书当然不会开放给群组使用,但是家庭相册是需要开放给每个人使用和查看的。
这个时候你只需要开放大家查看和下载家庭相册的权利即可。但是你需要给其他人别的权力,比如大家都可以上传属于自己的文件,就像你的情书一样。同时这是一个群组,也就是说,和微信或者QQ群一样,除了家庭群组之外,你还可以拥有其他群组,比如基友,比如学校。
3)其他人
其他人是什么意思呢?还是以刚才的例子为例。
不同群组中的人之间就是其他人关系,除非大家通过共同的一个人,才能分享互相之间的资源。
4)文件位置
在 Linux 系统中,默认情况下,所有的系统账号与相关信息,都记录在下面这个文件夹下 /etc/passwd。
个人密码则是记录在 /etc/shadow 中。
所有的组名都记录在 /etc/group 中。
Linux文件权限
对于上一节谈到的文件权限,作为一个重要指令,那么如何查看当前文件的归属?
假设以图中的主函数为例,可以看到一共分为七个部分。
从左向右,依次是文件权限,文件个数,文件拥有者,群组,文件大小,文件修改日期,文件名。
这里用到了一个命令行是:
ls -lah
具体的含义将会在下面详细介绍,具体来看一下文件权限部分的情况。
1)文件权限
摘自《鸟哥的Linux私房菜-基础篇》第四版
可以看到整个部分一共分为十个位置,分别是文件类型,文件拥有者权限,群组权限,其他人权限。其中,文件类型一共分为几种:
- -:普通文件
- d:目录文件/文件夹
- c:硬件字符设备(装置文件里的串行端口设备,如键盘,鼠标<一次性读取装置>)
- b:硬件块设备(装置文件里的可供储存的接口设备<可随机存取装置>)
- s:管道文件
- l:软链接文件
接下来的字符rwx分别是什么意思呢?
- r代表可读(read)
- w代表可写(write)
- x代表可执行(execute)
需要注意的是,这三种权限的相对位置不会发生改变,如果没有该权限,那么该位置是 - 。
2)文件个数
每个文件都会和其他文档之间构建一个文件系统,这里需要注意的是,对于文件夹来说,至少连接数是2。其实表示的就是当前文件夹下的文件夹个数,所以记得算上下面两个。
- .代表当前目录
- . .代表上一级目录
3)使用者与群组和其他人
文件的权限拥有者主要分为三类:
- 文件拥有者
- 文件所属群组
- 其他人
这决定了当前文件在不同人手里的权限,可以通过一个命令进行查询。
4)文件大小
该项表示文件大小,默认单位是bytes。如果想要变成带单位的表示,只需要加上 -h 即可。这里文件较小,所以差别较小。
5)文件修改日期
如果想要显示详细时间的话,使用命令 ll 即可。
如果该文件的修改时间距离现在太久,那么只会显示年份。
6)文件名
除了 . 和 . . 之外,就是正常的文件名。
特殊文件会有相应的尾缀来表示其打开或运行方式。
whoami命令
如果想要查看自身用户,可以使用 whoami
命令用于显示自身用户名称,相当于执行 id -un
指令。
ls命令
Linux命令格式
command [-options] [parameter1] ...
ls -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
ls -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
ls -A 同 -a ,但不列出 “.” (目前目录) 及 “. .” (父目录)
ls -F 在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/”
ls -R 若目录下有文件,则以下之文件亦皆依序列出
ls --help 帮助文档
man ls
空格:显示手册页的下一屏
Enter键:一次滚动手册页的一行
b:回滚一屏
f:前滚一屏
q:推出man命令
h:列出所有功能键
/word 搜索word字符串
ls -h以人能看懂的方式显示
ls + 指定文件名,显示指定文件是否存在
1)重定向 >
ls > test.txt
-
存在,覆盖
-
不存在,新建
2)追加 >>
ls >> text.txt
- 存在,添加
- 不存在,新建
3)正则化匹配
*,? 通配符
其中 * 是代表多个字符的匹配,? 是代表某一个字符的匹配。
快捷键命令
Tab键可以自动补全
方向键可以回溯历史
history可以看看历史
clear 清屏
file world 查看文件类型
which 在环境变量$PATH设置的目录里查找符合条件的文件
du ./目录 -h 查看某个目录大小
管道命令
| 管道
grep 关键字过滤
可以与多种命令进行结合
grep [0-9]abs[0-9] test.txt -n 查找4abc5
与 grep .abs. test.txt -n 等价
grep ^1 test.txt 搜寻以1开头
grep 1$ test.txt 搜寻以1结尾
cd命令
cd 切换主目录
cd ~ 切换主目录
cd . 切换当前目录
cd . . 切换上级目录
cd - 切换上一个目录
mkdir命令
mkdir abs 创建abs目录
mkdir ./a/b/c -p 递归创建目录
rmdir命令
rmdir abs 删除空文件夹
rm命令
rm abs -r 删除目录
rm 1.c 删除文件
rm * -rf 删除所有,递归,无提示
rm *.png -rf 和 rm * .png -rf
- rm *.png -rf 是删除所有的png格式文件
- rm * .png -rf 是删除所有文件和所有的png格式文件
rm 1.c -i 人性化询问
ln命令
ln -s 创建一个软链接,相当于快捷方式。删除源文件,软链接置零
如果没有参数,ln默认创建的是硬链接。
修改源文件,硬链接也修改
硬链接只能链接普通文件,不能链接目录。
find命令
find可以递归查找指定目录下所有子目录
- find ./ -name b.txt 在当前目录下查找名字叫b.txt的文件
- find ./ -name test.txt 在当前目录下查找名字叫test.txt的文件
find ./ -size 4k/+4k/-4k 在当前目录下寻找大小等于/大于/小于4k的文件(k小写,M大写)
find ./ -size +1k -size -3k 在当前目录下寻找大小大于1k小于3k的文件
find ./ -perm 0777 在当前目录下寻找权限为777的文件
cp命令
cp hello.c mike.c 复制hello.c为mike.c
cp test/ mike -r 复制test目录为mike目录
cp hello.c result.c -v 能看到复制的进度
mv命令
mv hello.c test 移动并改名
mv hello.c a.c 移动并改名
mv a.c amd 移动并改名
tar命令
tar -cvf abc.tar abc 把abc这个目录打包,生成一个文件名字叫abc.tar
tar -xvf abc.tar 把abc.tar这个文件中所有的文件提取出来
tar -xvf abc.tar -C mike 指定解压目录
tar只负责把多个文件打包,而不负责压缩
其中,-c 创建 -x 解压 -v 进度 -f 文件名
gzip命令
gzip 【-r】 abc.tar 把abc.tar文件压缩为abc.tar.gz
gzip -d abc.tar.gz 把abc.tar.gz解压为abc.tar
tar -czvf abc.tar.gz 所需文件,一步到位,从普通文件之间变成tar.gz
tar -xzvf abc.tar.gz 一步到位,从tar.gz变成普通文件
bzip2命令
bzip2 abc.tar 压缩文件为abc.tar.bz2
bzip2 -d abc.tar.bz2 解压缩文件为abc.tar
tar -cjvf abc.tar.bz2 所需文件
tar -xjvf abc.tar.bz2
zip命令
zip -r abc.zip abc.tar 把abc.tar压缩为abc.zip
unzip abc.zip abc.tar 把abc.zip解压为abc.tar
su命令
1)ubuntu设置root用户密码的方法
ubuntu系统在安装的时候没有设置过root用户的密码,或者设置了密码都可以:
- sudo passwd root
- 提示你输入当前用户的密码
- 输入你当前用户的密码
- 提示你输入root用户的密码,要输两遍
2)切换用户
su -
再输入root密码就可以了
3)新建用户
useradd -d /home/abc abc -m 新建一个用户,用户名叫abc
passwd abc 修改abc用户的密码
- -d的意思是指定用户的主目录
- 什么是主目录?每个用户都有一个家,这个家其实是一个目录,用户登陆的时候默认的当前目录。所有的用户都需要有一个主目录,普通用户的主目录一般是在/home目录下。用户名和主目录的名字是一样的。
- -m的意思是,如果主目录不存在,那么就自动创建这个目录
- 如果创建用户的时候,没有指定用户所属的组名,那么系统会自动创建一个和用户名一样的组名,并且自动的把这个用户放到同名的组里
- 创建完用户,紧接着就要修改用户密码
su不加-,只是切换用户,但不改变当前目录
su - ,切换用户,同时将当前目录切换到目标用户的主目录
4)删除用户
userdel abc
删除abc这个用户,但不会自动删除abc的主目录
userdel -r abc
删除abc用户,同时自动删除用户的主目录
以上是关于LinuxC++开发面试系列:目录结构与文件权限的主要内容,如果未能解决你的问题,请参考以下文章
LinuxC++开发面试系列:代码运行gcc编译system函数与VS2013 C4996解决方法
LinuxC++开发面试系列:代码运行gcc编译system函数与VS2013 C4996解决方法