1、前言
在 Linux 中,用户可以使用命令对文件进行各种操作,而几条简单命令背后却是大段大段的程序实现代码。Linux C 编程实战第六章文件操作中关于文件的创建,打开,读写,关闭,删除,属性等内容十分详实,这里只是对文件权限和目录配置的内容进行简单记录。
2、文件结构
文件主要包含两方面内容:
- 文件本身包含的数据
- 文件的属性,包括文件访问权限、所有者、文件大小、创建日期等。
3、文件权限
在 Linux 中我们可以使用 ll
或者 ls –l
命令来显示一个文件的属性以及文件所属的用户和组,如
上面的运行结果从左至右依次是:文件属性、文件数、所属的用户、所属的用户所在的组、文件大小(单位bytes)、文件创建时间、文件名。
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
文件类型:
-
表示普通文件d
表示目录文件l
表示链接文件,比如快捷方式s
套接字文件c
字符设备文件,比如/dev/
中的很多文件b
表示块设备文件,比如一些磁盘p
管道文件
3.1、chmod(change model) 改变权限
对文件的访问权限的修改通过命令 chmod
来进行,如,
chmod 777 test.c
对于可读,可写,可执行三种权限,它们分别对应一个值,r = 4, w = 2, x = 1
4+2+1=7,777 表示将test.c 的访问权限修改为:所有者,所属组,其他用户都有读,写,执行的权限。
r:可读,意思是指可以读取文件的内容
w:可写,意思就是可以修改文件的内容
x:可执行,与windows不同,linux下文件可执行与否与后缀名无关,而与x权限属性相关
简化版chmod 命令 my_chmod.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc ,char **argv){
int mod,mod_u,mod_g,mod_o;
char *path;
if(argc<3){//检查参数合法性
printf("%s <chmod num><path>\n",argv[0]);
exit(0);
}
mod=atoi(argv[1]);//将字符串转换成整数
if(mod>777||mod<0){
printf("mod num error");
exit(0);
}
mod_u=mod/100;//所有者权限
mod_g=(mod-mod_u*100)/10;//所属组权限
mod_o=mod-mod_u*100-mod_g*10;//其他用户权限
mod=mod_u*8*8+mod_g*8+mod_o;//八进制转换
path=argv[2];
if(chmod(path,mod)==-1){
printf("chmod error");
exit(0);
}
return 0;
}
运行结果如下:
可见 test.c 文件的权限已被修改。
3.2、chgrp(change group) 改变用户组
重要参数:-R
递归改变权限,即把该目录下的文件,目录的权限全部同步修改,很好用,也很危险!
语法: chgrp [-R] group dirname/filename
(目录/文件名)
如下例所示:
3.3、chown(change owner) 改变用户
重要参数:同上 [-R],递归更改用户
语法:chown [-R] owner dirname/filename
改变所属用户
chown [-R] owner:group dirname/filename
改变所属用户,用户组
chown [-R] .group dirname/filename
改变所属用户组
如下例所示:
4、目录配置
linux系统的发行版本众多,如果更换一个版本的Linux系统,就需要重新学习Linux系统的目录配置,岂不是很麻烦???所以制定了FHS,即 Filesystem Hierarchy Standard(文件系统配置标准),以此来进行目录配置规范。
FHS标准对于Linux系统的目录配置文件,只定义了三层目录配置:
/ (root)目录:与开机系统有关
/usr目录:与软件安装/执行有关
/var目录:与系统运作过程有关
4.1、/ 根目录
/ 根目录,是Linux系统中最重要的一个目录了!所有的目录都是由根目录所衍生出来的,而且根目录还与机器的开机,还原,系统修复有关。根目录下的一些目录:
目录 | 应放置的文件内容 |
---|---|
/bin | bin为binary的简写,主要放置系统的必备执行文件,例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。 |
/boot | /boot中存放内核文件以及开机配置文件 |
/dev | 之前讲一切皆文件,/dev目录下都是设备文件 |
/etc | 系统的主要配置文件都存放在此处 |
/home | home目录即为用户目录 |
/lib | 系统开机时所用到的函数库 |
/media | “媒体”,指软盘,光盘等设备 |
/mnt | 用于暂时挂载的目录 |
/opt | 用于给第三方软件放置的目录 |
/root | 系统管理员目录 |
/sbin | 主要放置系统管理的必备程序,例如:dump、halt、ifconfig、ifup、 ifdown、init、reboot、rmmod、 runlevel、shutdown等。 |
/tmp | 一般用户或者暂时放置数据的地方 |
/lost+found | 文件系统发生错误时,将一些丢失的片段放在该目录下 |
/proc | 该目录是一个虚拟的文件系统,放置的数据都是在内存当中的,例如系统的内核,进程,外部设备的状态,网络状态等 |
/sys | 存放着已加载的内核模块和内核监测到的硬件设备信息等 |
4.2、/usr 目录
/usr(UNIX Software Resource)是与软件的安装/执行有关的目录,所存放的是可分享的与不可变动的数据文件。其下目录有:
目录 | 应放置的文件内容 |
---|---|
/usr/bin/ | 绝大部分的用户可使用命令都在此处 |
/usr/include/ | C/C++的头文件,包含文件都在此处 |
/usr/lib/ | 各类应用软件的函数库,目标文件以及一些非惯用的执行文件或脚本 |
/usr/local/ | 用户自行安装的软件都在此处,区别于发行版自带的软件 |
/usr/sbin/ | 非系统正常运行所需要的系统命令 |
/usr/share/ | 放置共享文件 |
/usr/src/ | 一般源码存放在这里,而内核源码存放在/usr/src/linux下 |
显然,/usr与 / 下有不少相同的目录,接下来就看看它们的区别:
- /bin 与 /usr/bin
/bin是根目录下的目录,其与开机过程有关,所以要放在开机时就挂载的/目录下
/usr/bin 中存放的也是一般用户所能用到的大多数命令,但是与开机过程不挂钩
- /lib 与 /usr/lib
/lib中放置的是在开机时首先会用到的函数库
/usr/lib中放置的则是各种应用软件的函数库,不一定开机时会用到
- /sbin 与 /usr/sbin
/sbin中存放的是超级用户 root一般使用的命令放置着系统管理所必须的程式
/usr/sbin中放置的则不一定是系统正常运行所必须的系统指令
- /opt 与 /usr/local
/opt目录下存放第三方软件,即并非发行版Linux安装时就装的软件
/usr/local目录下存放系统管理员在本机安装的软件,一般经由 apt 或 yum 安装的软件都放置于此
4.3、/var 目录
/var (variable)是与系统运作过程有关的目录。
目录 | 放置的文件内容 |
---|---|
/var/cache/ | 应用程序本身产生的缓存文件 |
/var/lib | 程序运行时需要的数据放置的目录 |
/var/lock | 程序锁,对于只能同时一个用户使用的程序上锁,防止两人同时使用 |
/var/log | 登录文件放置的目录 |
/var/mail | 个人信箱的目录 |
/var/run | 程序的PID放置目录 |
/var/spool | 通常放置一些队列数据 |
结语
关于章末的编程实践:实现自己的 ls 命令,这里先给出学长的代码,待日后再细品。(滑稽-> <-)