《Linux/Unix系统编程手册》读书笔记9(文件属性)

《Linux/Unix系统编程手册》读书笔记 目录

在Linux里,万物皆文件。所以文件系统在Linux系统占有重要的地位。本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有更深入的研究一定会写出来。

下图为磁盘分区与文件系统的关系

文件系统中的文件(目录)在i-node表上都有唯一的记录(i-node)。i-node通过数据块指针指向数据块,这些数据块就是该i-node对应的文件的数据。

i-node与数据块的关系如下:

因为Linux支持很多类型的文件系统,但是每种文件系统的实现存在差异。为了解决这种差异,内核提供了虚拟文件系统,通过在应用程序与文件系统之间添加一个抽象层来让程序员在编写应用程序的时候不用考虑文件系统的种类。

初步了解文件系统后,进入正题-----文件属性

正因为万物皆文件,我们很多时候需要获取文件的信息,以便知道它是普通文件还是目录文件,或者想知道它的时间戳等信息。这时候我们可以通过stat()系统调用来获取我们想要的文件信息。

1 #include <sys/stat.h>
2
3 int stat(const char *pathname, struct stat *statbuf);
4 int lstat(const char *pathname, struct stat *statbuf);
5 int fstat(int fd, struct stat *statbuf);

调用成功返回0,失败返回-1。文件的信息会存放到statbuf。

pathname为文件名,对于lstat,如果文件为符号链接的时候返回的为该链接的信息,而不是指向的文件。

fstat则是获取打开文件描述符对应的文件的信息。

接着来看看stat结构的格式:

其中将st_mode与S_IFMT相与,可以得到文件类型,而st_mode的低12位为文件权限。除此之外还有时间戳需要注意,st_atime代表上次访问时间,st_mtime代表上次修改文件时间,st_ctime代表上次文件状态发生改变的时间。

我们经常会接触到文件的权限。其中用户分为3类:文件的所属者(owner),文件所属者所在的用户组,其他用户。每类的用户有3种权限:可读,可写,可执行。

练习:

15-6:命令chmod a+rX file 的作用是对所有各类用户授予读权限,并且当file是目录或者file的任一类用户有可执行权限时,将向所有各类用户授予可执行权限。

 1 #include "tlpi_hdr.h"
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 #include <sys/stat.h>
 5 #include <sys/types.h>
 6
 7 #define READ (S_IRUSR | S_IRGRP | S_IROTH)
 8 #define EXECUTE (S_IXUSR | S_IXGRP | S_IXOTH)
 9
10
11 int main(int argc, char *argv[]){
12     struct stat sb;
13     int i;
14
15     if(argc < 1 || strcmp(argv[1], "--help") == 0)
16         usageErr("%s filename...\n", argv[0]);
17
18     for(i = 1; i < argc; i++){
19        if(stat(argv[i], &sb) == -1)
20            errExit("stat");
21
22        if((sb.st_mode & S_IFMT) == S_IFDIR){
23           if(chmod(argv[i], sb.st_mode | READ | EXECUTE) == -1)
24               errExit("chmod");
25        }
26
27        if((sb.st_mode & S_IFMT) == S_IFREG){
28           if(chmod(argv[i], sb.st_mode | READ) == -1)
29               errExit("chmod");
30           if((sb.st_mode & S_IXUSR) || (sb.st_mode & S_IXGRP) || (sb.st_mode & S_IXOTH))
31               if(chmod(argv[i], sb.st_mode | EXECUTE) == -1)
32                   errExit("chmod");
33        }
34     }
35
36     exit(EXIT_SUCCESS);
37 }

结果:

[[email protected] tlpi]$ ls -ld dir file prog
d--------- 2 lan lan 4096 Jul 18 12:31 dir
-r-------- 1 lan lan    0 Jul 18 12:31 file
-r-x------ 1 lan lan    0 Jul 18 12:31 prog
[[email protected] tlpi]$ ./15.6 dir file prog
[[email protected] tlpi]$ ls -ld dir file prog
dr-xr-xr-x 2 lan lan 4096 Jul 18 12:31 dir
-r--r--r-- 1 lan lan    0 Jul 18 12:31 file
-r-x--x--x 1 lan lan    0 Jul 18 12:31 prog

-------先把一个小坑填了,好久没有写博客了,这段时间找实习,准备考试。。。终于忙完了。。。。值得思考的事情太多太多了。。。。打算写一篇总结,终结这半年的事。。。。

-------继续努力吧,努力以后才不会后悔。。。。继续巩固Linux系统编程,多看书,多代码,多思考!!!!!!

《Linux/Unix系统编程手册》读书笔记9(文件属性),布布扣,bubuko.com

时间: 07-16

《Linux/Unix系统编程手册》读书笔记9(文件属性)的相关文章

《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h>文件中的常量. 通过cat 命令查看: [email protected]:~/Code/tlpi$ cat /usr/include/limits.h /* Copyright (C) 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2005 Free Software

《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候都会发生缓冲.通过缓冲可以在一定程度上将用户空间与实际的物理设备分离,还可以减少内核访问磁盘的次数. 先来看看关于内核缓冲区高速缓冲:read和write调用在对磁盘文件进行操作的时候不会直接访问磁盘,如下图所示. 例如:write(fd, "abc", 3) write调用会将"

Linux/Unix系统编程手册--SOCKET章节读书笔记

SOCKET章节读书笔记 强烈推荐Linux/Unix系统编程手册,号称超越APUE的神书. backlog含义 #include <sys/socket.h> int listen(int socketfd, int backlog) backlog参数限制未决连接(未accept)的数量,在这个数量之内,connect会立刻成功. Linux上上限为128,定义在 udp已连接socket udp socket也是可以调用connect()的,这种叫已连接socket,内核会记录这个soc

Linux/UNIX系统编程手册 PDF下载

网盘下载地址:Linux/UNIX系统编程手册 PDF下载 – 易分享电子书PDF资源网 作者: Michael Kerrisk 出版社: 人民邮电出版社 原作名: The Linux Programming Interface: A Linux and UNIX System Programming Handbook 译者: 孙剑 许从年 董健 / 孙余强 郭光伟 陈舸 出版年: 2014-1 页数: 1176 定价: 158 装帧: 平装 内容简介 · · · · · · <linux/un

TLPI(liunx/unix系统编程手册)笔记(四) 深入探究文件I/O

本章的重点我想就是原子操作,避免在几个进程在打开同一文件的时候造成的错误,了解一下时间片的概念会对本章有所帮助. (1)独占方式打开文件.(open     <-O_CREAT) 知道,open,可以创建文件并返回fd.当我们的进程运行到open这个函数时间片到了,另一个进程也对这个路径的文件open,那么时间片结束后两个进程都会认为自己是这个文件的拥有者.并未是独占创建打开的.在open 函数的第二个参数中有 O_EXCL 这种打开方式,可以解决独占的问题.另外可以在多进程对一个文件写的时候,

TLPI(liunx/unix系统编程手册)笔记(三) 文件IO:通用的IO模型

读下来总的就是介绍了四个IO的API--open,read,write,close. 大家都是知道的,everything is file,在linux系统里面一切都是看作文件来操作的,学习linux就得先学好文件IO,也可以看见TLPI这本书的介绍完一些概念之后就开始介绍文件IO了. IO,大概的分为磁盘文件IO,buffering(缓冲)IO.貌似缓冲的水很深,之后会写博客. ------------------------------------ (1)文件描述符. 在进行IO操作之前,总

Linux/UNIX系统编程手册 练习3.8

闲来无聊看了看  3-1. 使用Linux专有的reboot系统调用重启系统时,必须将第二个参数magic2定义为一组magic号(例如:LINNUX_REBOOT_MAGIC2).这些号有何意义?(将magic号转换为十六进制数,对解题会有所帮助.) 刚看的时候 有点晕就去查了查 转换成16进制了 . 结果发现 是彩蛋.... 原文地址:https://www.cnblogs.com/jingchu/p/10262241.html

linux/unix系统编程手册源码编译

我的操作,我在官网下载 书本源代码 ,在windows 解压后 ftp工具 传到 linux虚拟机 然后 make 发现 报错 如: No rule to make target `../libtlpi.a', needed by 郁闷好久! 方案: 把源代码压缩包 ftp到虚拟机 在解压缩,make 就成功了! 注意,习惯: 永远在linux解压缩

Linux Unix shell 编程指南学习笔记(第一部分)

第一章:文件安全与权限: 1.文件和目录的权限 创建文件时系统保存了文件所有相关的信息,包括 文件的位置 . 文件类型 . 文件长度 . 哪位用户拥有该文件,哪些用户可以访问该文件 . i 节点 . 文件的修改时间 . 文件的权限位 . 文件类型: d: 目录 l : 符号链接(指向另一个文件) s: 套接字文件 b: 块设备文件 c: 字符设备文件 p: 命名管道文件 -: 不属于上述类型的文件 文件权限 XXX       XXX        XXX 最左边 XXX : 文件属主 权限位