Linux文件I/O(一)

概述

文件操作符

文件是操作系统的一个重要概念。所有执行I/O操作的系统调用都以文件描述符,一个非负整数,来指代打开的文件。可以用来表示所有类型的已打开文件(pipe,FIFO,socket,终端,设备,普通文件),针对每个进程,文件描述符自成一套。

一般大多数程序都使用三种标准的文件描述符。包括shell。

标准文件描述符

文件描述符 用途 POSIX名称 stdio流
0 标准输入 STDIN_FILENO stdin 
1 标准输出 STDOUT_FILENO stdout
2 标准错误 STDERR_FILENO stderr

执行文件I/O操作的4个主要系统调用:

  • fd = open(pathname,flags,mode) 打开pathname所标识的文件,并返回文件描述符,用以在后面的程序中表示打开的文件。如果文件不存在,则可以设置flags位来决定是否创建新文件,flags还可以确定以什么模式打开文件(只读,只写,读写)。如果文件是新创建的,则可以设置mode参数决定文件的访问模式。如果没有创建新文件,可以忽略mode 参数。
  • numread = read(fd,buffer,count) 调用从fd所指代的打开文件,从中读取最多count字节的数据,存至buffer中。read返回实际读取的字节数给numread。实际上,若在一次读取中遇到文件结束符EOF,返回值不等于count。
  • numwritten = write(fd,buffer,count) 向fd所指代的文件中写入至多count字节,这些字节来自于buffer中。write返回实际写入的字节数。
  • status = close(fd) 在对文件的操作都结束后,调用close(),释放文件描述符以及与之相关的内核资源。与文件相关的内核资源可自行百度操作系统相关知识。

使用以上系统调用可以简单实现一个copy程序,该程序从命令行读取两个参数(源文件path,新文件path),copy一个文件。

程序清单如下:

 1 /* copy.c
 2
 3    Copy the file named argv[1] to a new file named in argv[2].
 4 */
 5 #include <sys/stat.h>
 6 #include <fcntl.h>
 7 #include <stdio.h>
 8 #include <stdlib.h>
 9
10 #ifndef BUF_SIZE        /* Allow "cc -D" to override definition */
11 #define BUF_SIZE 1024
12 #endif
13
14 int
15 main(int argc, char *argv[])
16 {
17     int inputFd, outputFd, openFlags;
18     mode_t filePerms;
19     ssize_t numRead;
20     char buf[BUF_SIZE];
21
22     /* Open input and output files */
23
24     inputFd = open(argv[1], O_RDONLY);
25     if (inputFd == -1) {
26         printf("openning file %s failture",  argv[1]);
27         exit(EXIT_FAILURE);
28     }
29
30     openFlags = O_CREAT | O_WRONLY | O_TRUNC;
31     filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
32                 S_IROTH | S_IWOTH;      /* rw-rw-rw- */
33     outputFd = open(argv[2], openFlags, filePerms);
34     if (outputFd == -1) {
35         printf("openning file %s failture",  argv[2]);
36         exit(EXIT_FAILURE);
37     }
38
39     /* Transfer data until we encounter end of input or an error */
40
41     while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
42         if (write(outputFd, buf, numRead) != numRead) {
43               printf("Can not write whole file!");
44               exit(EXIT_FAILURE);
45         }
46
47     if (numRead == -1) {
48          printf("Read failure!");
49          exit(EXIT_FAILURE);
50     }
51
52     if (close(inputFd) == -1) {
53         printf("close file error!");
54         exit(EXIT_FAILURE);
55     }
56     if (close(outputFd) == -1) {
57         printf("close file error!");
58         exit(EXIT_FAILURE);
59     }
60     exit(EXIT_SUCCESS);
61 }

通用I/O

UNIX I/O模型的显著特点是其输入/输出的通用性概念。这意味着使用上面4个系统调用可以对所有类型的文件执行I/O操作,包括终端之类的设备,因此,仅使用这些系统调用编写的程序将对任何类型的文件有效。


I/O调用详解

open:打开文件

函数原型:int open (const char *pathname, int flags, .../* mode_t mode */)

返回值

调用成功:返回fd文件描述符

调用失败:返回-1 ,置errno为相应的错误标志

pathname

pathname标识要打开的文件, 如果pathname是符号链接,则会自动对其进行解引用。

flags

flags为位掩码,用于指定文件访问模式,常用的如下

O_RDONLY   以只读方式打开

O_WRONLY  以只写方式打开

O_RDWR      以读写方式打开

三种里每次只可以以一种方式打开

其它一些重要的模式:

O_CREATE   如果文件不存在,则创建空文件,一般这种情况下需要提供mode参数,不然新文件的权限将是栈中的随机值

时间: 2024-10-31 13:33:29

Linux文件I/O(一)的相关文章

Linux 文件权限总结

在 Linux 中最基本的任务之一就是设置文件权限.理解它们是如何实现的是你进入 Linux 世界的第一步.如您所料,这一基本操作在类 UNIX 操作系统中大同小异.实际上,Linux 文件权限系统就直接取自于 UNIX 文件权限(www.lampbrother.net). 但不要以为理解文件权限需要长时间的学习.事实上会很简单,让我们一起来看看你需要了解哪些内容以及如何使用它们. 基础概念 你要明白的第一件事是文件权限可以用来干什么.当你设置一个分组的权限时发生了什么?让我们将其展开来说,这个

备忘-linux文件系统结构

用apache的时候总是要进入/var/www, 用久了开始好奇这些个目录都是派什么用处的,简单整理了一下 /bin 存放二进制命令文件,这个目录下面不允许存在子目录/boot bootloader的静态文件,当然OS的文件也必须在这里/dev 设备文件,MAKEDEV命令可以创建设备/etc 特定主机的配置文件,必须是静态文件,非可执行文件: opt, X11, sgml, xml/home 用户目录 /lib 存放主要的共享库和核心模块/media 可移除媒体的挂载点: floppy, cd

linux文件层级、目录、文件基本操作介绍

1.文件层级FHS介绍: Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件. FHS定义了系统中每个区域的用途.所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理. /:linux文件系统根目录 /bin:供所有用户使用的基本命令文件 /sbin:供系统管理员使用的工具程序文件 /lib:供/bin和/sbin程序调用的库文件程序,及系

Linux文件查找之find&locate

Linux文件查找之find&locate 一.概述 Linux系统核心的思想之一"一切皆文件",对于这么多的文件,如何快速查找过滤呢?下面我们就看看系统提供的文件查找命令find和locat,熟练使用find命令是运维人员的必经之路 二.find的用法及示例 1.find特点 查找速度略慢 精确查找 实时查找 只能搜索有读取和执行权限的目录 2.find用法 用法:find  [options]  [查找路径]  [ 查找条件]  [处理动作] 查找条件: 根据文件类型查找

(转)剖析Linux文件编码的查看及修改

Linux文件编码的查看和修改都有不止一种做法,如果你需要在Linux中操作windows下的文件,那么很可能会经常遇到文件编码转换的问题,如何进行这项工作,也应该是经常工作在双系统下的操作者的必须掌握的知识. Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8.下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换. 查看文件编码 在Linux中查看文件编码可以通过以下几种方式: 1.在Vim中可以直接查看文件编码 :set fileen

Linux文件权限与目录管理

Linux文件系统的三种身份 文件所有者 同组用户 同一个用户组的用户可以访问该用户组的文件: 每个账号可以加入多个用户组. 在同一个用户组的文件也可以设置不同的权限,可以不让本组用户查看. 其他人 除了文件主.同组用户以外的人就是其他人. PS: /etc/passwd 记录所有用户的账号 /etc/shadow 记录所有用户的密码 /etc/group 记录所有的组名 文件属性 ls -al 显示所有的文件名和相关属性(包括以.开头的隐藏文件) total 72 drwxr-xr-x+ 28

linux 文件夹的颜色代表什么意思

linux 文件夹的颜色代表什么意思 绿色 蓝色 黑色代表什么意思 蓝色表示目录: 绿色表示可执行文件: 红色表示压缩文件: 浅蓝色表示链接文件: 灰色表示其它文件: 红色闪烁表示链接的文件有问题了: 黄色是设备文件,包括block, char, fifo. 用dircolors -p看到缺省的颜色设置,包括各种颜色和“粗体”,下划线,闪烁等定义. 在环境变量$LS_COLORS上修改就行

Linux文件与目录的权限(chown、chmod)

chown,即为change owner 如下图: hadoop-1.2.1.tar.gz原来的拥有者为hadoop用户,现将其拥有者修改为root: ======================================================================== chmod,即为change mode Linux文件或者目录共有10个属性: 首先是第一个属性,“横线”代表文件,“d”代表目录 剩余九个属性,分为三组,每组三个属性:读(r),写(w),执行(x).

【转】每天一个linux命令(24):Linux文件类型与扩展名

原文网址:http://www.cnblogs.com/peida/archive/2012/11/22/2781912.html Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大多是常规文件(也被称为普通文件). 一. 文件类型 Linux文件类型常见的有:普通文件.目录文件.字符设备文件和块设备文件.符号链接文件等,现在我

linux文件和目录权限的设置

linux文件和目录权限的设置 修改文件权限 如果想改变文件或目录的权限,可以使用chmod命令,改变文件或目录的权限有两种方法:助记法和八进制法. ·助记法: 语法: 使用u(user).g(group).o(other).a(all)表示要设置权限的位置,使用+表示添加.使用-表示减少权限.使用=表示设置为什么样的权限,使用rwx表示权限. 例如: [email protected] tmp]# touch test.txt [[email protected] tmp]# ll total