1. 什么是IO?
  • 输入/输出是主存和外部设备之间拷贝数据的过程

设备->内存(输入操作)

内存->设备(输出操作)

  • 高级I/O

ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O

  • 低级I/O

通常也称为不带缓冲的I/O

2. 文件描述符:fd

  • 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。
  • 当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息。
  • 一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。C库函数中与之对应的是:stdin,stdout,stderr,不过这三个是FILE指针类型。

3.文件描述符与文件指针相互转换

可以通过以下两个函数实现:

  • fileno:将文件指针转换为文件描述符

#include <stdio.h>

int fileno(FILE *stream)

测试程序:

#include <stdlib.h>
#include <stdio.h> int main(void)
{
printf("fileno(stdin) = %d\n", fileno(stdin));
printf("fileno(stdout) = %d\n", fileno(stdout));
printf("fileno(stderr) = %d\n", fileno(stderr));
return ;
}

测试结果:

  • fdopen:将文件描述符转换为文件指针

#include <stdio.h>

FILE *fdopen(int fd, const char *mode)    //mode :r,w,r+,w+,a,a+

4.文件系统调用

  • open系统调用

有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open()(打开)系统调用

函数原型

#include <sys/types.h>
#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

参数

path :文件的名称,可以包含(绝对和相对)路径

flags:文件打开模式

mode:用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限

返回值

打开成功,返回文件描述符;

打开失败,返回-1

文件打开方式:

O_EXCL表示:当O_EXCL|O_CREAT时,若文件存在,则打开失败,不存在,则打开成功

访问权限:

open系统调用的几点说明:

可以利用按位逻辑加(bitwise-OR)(|)对打开方式的标志值进行组合。

如打开一个新文件:

#define NEWFILE  (O_WRONLY|O_CREAT|O_TRUNC)

对访问权限位进行访问所用到的标识符,均可以通过

#include <sys/stat.h> 访问到,同样可以通过|运算来对访问权限进行组合也可以直接给出数字表示如0655

#define MODE755 (S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)

注:文件的访问权限是根据:umask&~mode得出来的,例如umask=0022,mode = 0655 则访问权限为:644

测试程序:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while() int main(void)
{
umask();
int fd;
fd = open("test.txt", O_WRONLY | O_CREAT, );
if (fd == -)
ERR_EXIT("open error"); printf("open succ\n");
return ;
}

测试结果一:采用默认的umask值

测试结果二:重新设置umask值

    • close系统调用

为了重新利用文件描述符,用close()系统调用释放打开的文件描述符

函数原型:

#include <unistd.h>

int close(int fd);

函数参数:

-fd :要关闭的文件的文件描述符

返回值

如果出现错误,返回-1

调用成功返回0

注:若没有显示调用close(),当程序退出时也会关闭文件

    • creat系统调用

为了维持与早期的UNIX系统的向后兼容性,Linux也提供可选的创建文件的系统调用,它称为creat()。现代的linux内核很少采用creat创建文件,因为open可以完成创建功能

函数原型:

int creat(const char *path, mode_t mode);

参数

path :文件的名称,可以包含(绝对和相对)路径

mode: 用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限

返回值

打开成功,返回文件描述符;

打开失败,返回-1

在UNIX的早期版本中,open()系统调用仅仅存在两个参数的形式。如文件不存在,它就不能打开这些文件。文件的创建则由单独的系统调用creat()完成。在Linux及所有UNIX的近代版本中,creat()系统调用是多余的。

creat()调用

fd = creat(file, mode);

完全等价于近代的open()调用

fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);

linux系统编程之文件与IO(一):文件描述符、open,close的更多相关文章

  1. linux系统编程之文件与io(一)

    经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自 ...

  2. linux系统编程之文件与io(五)

    上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...

  3. Linux C 程序 文件操作(Linux系统编程)(14)

    文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...

  4. Linux系统编程(1)——文件与I/O之C标准I/O函数与系统调用I/O

    Linux系统的I/O也就是一般所说的低级I/O--操作系统提供的基本IO服务,与os绑定,特定于Linux平台.而标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头 ...

  5. Linux系统编程、网络编程-文件I/O

    第一章:文件io 1. 文件io讲些什么 文件io这一章讲的是,如何调用Linux OS所提供的相关的OS API,实现文件的读写. 1.1 如何理解“文件IO”这个词 IO就是input outpu ...

  6. Linux系统编程温故知新系列 --- 01

    1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...

  7. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

  8. linux系统编程:cp的另外一种实现方式

    之前,这篇文章:linux系统编程:自己动手写一个cp命令 已经实现过一个版本. 这里再来一个版本,涉及知识点: linux系统编程:open常用参数详解 Linux系统编程:简单文件IO操作 /*= ...

  9. linux系统编程综合练习-实现一个小型的shell程序(一)

    之前已经花了不少篇幅学习了linux系统编程的很多知识点:文件与io.进程.信号.管道,而零散的知识点,怎么能够综合的串接起来是学习的一个很重要的目的,当然最好的方式就是用所学的知识点做一个项目了,所 ...

  10. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

随机推荐

  1. 第八章 高级搜索树 (b1)B-树:动机

  2. 什么场景应该用 MongoDB(转)

    很多人比较关心 MongoDB 的适用场景,也有用户在话题里分享了自己的业务场景,比如: 案例1 用在应用服务器的日志记录,查找起来比文本灵活,导出也很方便.也是给应用练手,从外围系统开始使用Mong ...

  3. Linux objdump命令

    一.简介 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具. 二.选项 http://my.oschina.net/alphajay/blog/7729 http://man. ...

  4. Banner中文字怎么排版才好看?

    今天这命题,相信有很多人提出过疑问,一个好的文字排版会给你的作品增添色彩,我们先看看好的作品是怎样的. 看完这些图大家都能感觉出来这是一个好的作品,大家天生就对美和丑有一定的区分. 其实文字排版也好, ...

  5. laravel创建控制器

    一.创建 php artisan make:controller Admin/IndexController 二.目录 app/Http/Controllers/ 控制器存储目录 [ C控制器 ]

  6. 用 npm 安装删除模块

    npm安装模块 [npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录: [npm install -g xxx]利用npm安装全局模块xxx: 本地安装时将模块写入pac ...

  7. [SoapUI] 将科学计数法转化为普通数字,并且只保留小数点后几位

    方案一: import java.text.NumberFormat class CompareHashMap { def regEx_Numeric = '-?[1-9]\\d*$|-?([1-9] ...

  8. python常用模块及面向对象(一)

    目录: 常用模块之time模块 常用模块之random模块 常用模块之os模块 常用模块之sys模块 常用模块之subprocess模块 常用模块之json模块 常用模块之pickle模块 常用模块之 ...

  9. 测试这个才可以打包 我的PYQt matplotlib numpy 等程序

    from distutils.core import setup import py2exe import matplotlib import sys import FileDialog import ...

  10. MySQL的left on 【zt】

    MySQL的left on [zt] (2008-11-03 17:27:30) 转载▼ 标签:  it 分类: 学习笔记 MySQL多表连接查询Left Join,Right Join php开源嘛 ...