Linux 软件系列之五——不带缓存的IO操作

来源:互联网 发布:安装sql之后找不到程序 编辑:程序博客网 时间:2024/05/01 04:52

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中写入过'\0'的话,那么gedit会无法查看a.c,这时候需要将a.c重新删除,然后新建一个a.c即可。最后一点,不带缓存文件操作,读写都是直接对文件的操作,不会延时,所以写入的话直接就写入到文件中(可以在写入函数之后加一个10秒钟的系统延时,然后查看对应的a.c是什么时候内容更新的)。

9.lseek函数

功能:对文件描述符fd的读写指针进行设置。

10.close函数

功能:终止文件描述符fd与其对应的文件之间的关联。检查close调用的返回结果非常重要,有的文件系统,特别是网络文件系统,可能会在关闭之前报告文件写操作中出现的错误,只是因为在执行写操作时,数据可能未被确认写入。

11.ioctl函数

#include <unistd.h>

int ioctl(int fd, int cmd, ...);

功能:对描述符fd引用的对象执行cmd参数中给出的操作。根据特定设备所支持操作的不同,它可能还会有一个可选的第三个参数。

12.三个特殊的文件描述符

三个操作系统预先分配的文件标识符。通常,一个进程启动时,都会打开3 个文件:

 

文件描述符

标准输入

0

STDIN_FILENO

标准输出

1

STDOUT_FILENO

标准出错

2

STDERR_FILENO

注意:因为这三个描述符的存在,所以用户自己打开文件得到的文件描述符不会是这三个数字。

13.在linux中,所谓特殊文件,就是指普通文件以外的其他文件,除了普通文件,还有其它几类文件:设备文件、目录文件、链接文件、管道文件。

14.目录文件的操作

五个常用的函数:mkdir、rmdir、readdir、opendir、closedir








注意:readdir函数如果这个目录中的文件已经被读取完毕,那么就会返回一个NULL。

15.链接文件

链接文件有点像windows系统中的快捷方式,但是又不完全一样。Linux系统中的链接有两种方式:软链接和硬链接

1)软链接

软链接又叫符号链接,这个文件包含了另一个文件的路径名,可以是任意文件或目录。

使用命令行创建软链接:ln -s 源文件或目录 目标文件

使用函数创建软链接:

例如:symlink("test.c", "ltest");

2)硬链接

硬链接文件和软链接执行的效果差不多,但是硬链接不允许给目录建立链接

使用命令行创建硬链接:ln 源文件 目标文件

使用函数创建硬链接:

link(const char *oldpath,const char *newpath);

例如:quot;Times new romanLinux

16.fstat、stat和lstat系统调用

#include <unistd.h>

#include <sys/stat.h>

#include <sys/types.h>

 

int fstat(int fildes, struct stat *buf);

int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

 

0 0