概述
1.linux文件系统
文件:指有名字的一组数据的集合;
文件系统:指一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念替代了硬盘和光盘等物理设备使用的物理块的概念,用户使用文件系统来保存数据不必关心实际数据保存在哪个数据块上,只需要记住这个文件的所属目录和文件名即可。
每个文件都有特定的属性:
Linux的属性比较复杂,主要包括文件类型和文件权限两个方面。
Linux常见的五种类型文件:普通文件、目录文件、链接文件、管道文件、设备文件。
2.linux文件的权限
Linux系统是个典型的多用户系统,不同的用户处于不同的地方,为了保护系统的安全性,Linux“r”对不同的用户访问同一文件的权限做了不同的规定。它的权限分为四类:可读、可写、可执行和无权限。分别用“r”、“w”、“x”、“-”来表示。
3.权限示意图
第一位:表示文件的类型。(“-”普通文件、 “l”链接文件、“b”块设备文件、“p”管道文件、“d”目录文件,“c”字符设备文件)
第二位至第四位:表示文件所有者的访问权限,“u”表示
第五位至第七位:表示文件所有者同组用户的访问权限,“g”表示
第八位至第十位:其它用户的权限,“o”表示
4.权限修改
chmod a-w 1.c//所有用户去掉w权限
chmod u+x 1.c//所有者增加可执行权限
chmod g+x 1.c
chmod o+wx 1.c
修改的另一种方法:
文件权限:- rwx -wx --x
111 011 001
chmod 7 3 1 文件名//一次把三个组的权限都修改了
5.不带缓存的IO操作简介
不带缓存的文件I/O 操作,主要用到5 个函数:open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数,所以我们也称它为系统调用文件。这些函数虽然不是ANSI C的组成部分,但是是POSIX 的组成部分。
6.open函数
man 2 open:查看man手册找到的第二章的内容,第一章不是我们需要查找的函数的信息
open函数还具有下面这种两个参数的形式:
int open(const char *pathname, int flags);
功能:open函数建立了一条到文件或设备的访问路径,如果调用成功,它将返回一个可以被read、write和其他系统调用使用的文件描述符。这个文件描述符是唯一的,它不会与任何其他运行中的进程共享。如果两个程序同时打开一个文件,会得到不同的文件描述符,各自操作各自的,数据可能会出现覆盖的可能。
上面这些标志位中O_RDONLY, O_WRONLY, or O_RDWR三者必须包含其中一个,后面的标志位可以通过逻辑或运算符添加在上面的标志符之后。
注意:文件描述符是一个整型数值。任何一个运行中的程序能够同时打开的文件数是有限的。这个限制通常是由limits.h头文件中的常量OPEN_MAX定义的,这个值随着系统的不同而不同,但是POSIX(POSIX 表示可移植操作系统接口(Portable Operating System Interface))要求它至少为16。
补充:有几个因素会对文件的访问权限产生影响。首先,指定的访问权限在创建文件时会影响。其次,用户掩码(由shell的umask命令设定)会影响到被创建文件的访问权限。open调用里给出的mode值将与当时的用户掩码的反值做AND运算。umask是一个系统变量,它的作用是:当文件被创建时,为文件的访问权限设定一个掩码。执行umask这个命令可以修改这个变量的值。
7.read函数
功能:从文件描述符fd相关联的文件里读取count个字节的数据,并将这些数据存入buf中。返回值为实际读入的字节数,这可能会小于请求的字节数。如果read调用返回0就表示未读入任何数据,已达到了文件尾。
8.write函数
功能:把缓冲区buf的前count个字节写入与文件描述符fd关联的文件中。返回值为实际写入的字节数。如果返回-1表示出错,错误代码保存在全局变量errno中。
注意:write可能会报告写入的字节比要求的少,这并不一定是一个错误,所以在程序中需要判定write的返回值,如果没有完全写入那么久需要再次调用write将剩余的字节写入。如果写入文件总是报错(返回值为-1),那么考虑是不是打开文件时的打开权限设置不对。如果使用a.c作为打开对象,如果前面向a.c中写入过'