Linux C编程实战之文件操作学习记录

1、前言

在 Linux 中,用户可以使用命令对文件进行各种操作,而几条简单命令背后却是大段大段的程序实现代码。Linux C 编程实战第六章文件操作中关于文件的创建,打开,读写,关闭,删除,属性等内容十分详实,这里只是对文件权限和目录配置的内容进行简单记录。

2、文件结构

文件主要包含两方面内容:

  • 文件本身包含的数据
  • 文件的属性,包括文件访问权限、所有者、文件大小、创建日期等。

3、文件权限

在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如

上面的运行结果从左至右依次是:文件属性、文件数、所属的用户、所属的用户所在的组、文件大小(单位bytes)、文件创建时间、文件名。

每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。

image-20210208214725950

文件类型:

  • - 表示普通文件
  • d 表示目录文件
  • l 表示链接文件,比如快捷方式
  • s 套接字文件
  • c 字符设备文件,比如/dev/中的很多文件
  • b 表示块设备文件,比如一些磁盘
  • p 管道文件

3.1、chmod(change model) 改变权限

对文件的访问权限的修改通过命令 chmod 来进行,如,

chmod 777 test.c

image-20210208221801438

对于可读,可写,可执行三种权限,它们分别对应一个值,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;
}

运行结果如下:

image-20210208223940269

可见 test.c 文件的权限已被修改。

3.2、chgrp(change group) 改变用户组

重要参数:-R 递归改变权限,即把该目录下的文件,目录的权限全部同步修改,很好用,也很危险!

语法: chgrp [-R] group dirname/filename (目录/文件名)

如下例所示:

image-20210214083539619

3.3、chown(change owner) 改变用户

重要参数:同上 [-R],递归更改用户

语法:chown [-R] owner dirname/filename 改变所属用户

chown [-R] owner:group dirname/filename 改变所属用户,用户组

chown [-R] .group dirname/filename 改变所属用户组

如下例所示:

image-20210214084556022

4、目录配置

linux系统的发行版本众多,如果更换一个版本的Linux系统,就需要重新学习Linux系统的目录配置,岂不是很麻烦???所以制定了FHS,即 Filesystem Hierarchy Standard(文件系统配置标准),以此来进行目录配置规范。

FHS标准对于Linux系统的目录配置文件,只定义了三层目录配置:

/ (root)目录:与开机系统有关

/usr目录:与软件安装/执行有关

/var目录:与系统运作过程有关

4.1、/ 根目录

/ 根目录,是Linux系统中最重要的一个目录了!所有的目录都是由根目录所衍生出来的,而且根目录还与机器的开机,还原,系统修复有关。根目录下的一些目录:

image-20210214215243141

目录应放置的文件内容
/binbin为binary的简写,主要放置系统的必备执行文件,例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。
/boot/boot中存放内核文件以及开机配置文件
/dev之前讲一切皆文件,/dev目录下都是设备文件
/etc系统的主要配置文件都存放在此处
/homehome目录即为用户目录
/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)是与软件的安装/执行有关的目录,所存放的是可分享的不可变动的数据文件。其下目录有:

image-20210214220013565

目录应放置的文件内容
/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)是与系统运作过程有关的目录。

image-20210214221639768

目录放置的文件内容
/var/cache/应用程序本身产生的缓存文件
/var/lib程序运行时需要的数据放置的目录
/var/lock程序锁,对于只能同时一个用户使用的程序上锁,防止两人同时使用
/var/log登录文件放置的目录
/var/mail个人信箱的目录
/var/run程序的PID放置目录
/var/spool通常放置一些队列数据

结语

关于章末的编程实践:实现自己的 ls 命令,这里先给出学长的代码,待日后再细品。(滑稽-> <-)

Linux系统编程:my_ls(l、R、A、r、n、h、i、颜色的实现)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值