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. 转-git 配置用户名和邮箱

    原址:http://www.cnblogs.com/fsong/p/5540840.html 在安装了git for windows之后,个人总是忘记配置git config的命令,以此记录一下: 配 ...

  2. 亲, 我们来再重申一遍"=="和"equals的区别

    今天经历的一个事情太丢脸了, 一个学弟向我请教问题, 是这样的: 一个字符串里面含有空格, 不允许使用.trim()和replace方法, 只用if和for将空格去掉, 题目很简单, 一开始我是这样写 ...

  3. 关于mybatis缓存配置详解

    一级缓存: 一级缓存是默认的. 测试:在WEB页面同一个查询执行两次从日志里面看同样的sql查询执行两次. 2次sql查询,看似我们使用了同一个sqlSession,但是实际上因为我们的dao继承了S ...

  4. centos7 源码编译安装TensorFlow CPU 版本

    一.前言 我们都知道,普通使用pip安装的TensorFlow是万金油版本,当你运行的时候,会提示你不是当前电脑中最优的版本,特别是CPU版本,没有使用指令集优化会让TensorFlow用起来更慢. ...

  5. 利用委托机制处理.NET中的异常

    WinForm代码 private void button1_Click(object sender, EventArgs e) { try { Convert.ToInt32("abcd& ...

  6. 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)

    全基因组测序 全基因组测序分为从头测序(de novo sequencing)和重测序(re-sequencing). 从头测序(de novo)不需要任何参考基因组信息即可对某个物种的基因组进行测序 ...

  7. MapReduce调优总结与拓展

    本文为<hadoop技术内幕:深入解析MapReduce架构设计与实现原理>一书第9章<Hadoop性能调优>的总结. 图1 Hadoop层次结构图 从管理员角度进行调优 1. ...

  8. linux 基本工具相关

    首先是linux下安装ssh服务(root) 由于是使用debian版本 与其他稍有差别 安装服务 apt-get install ssh 查看服务是否开启 service ssh status 开启 ...

  9. linux磁盘管理(RHEL)

    IDE硬盘名称格式为/dev/hdXY,其中X为a-z的小写字母,Y为数字1-4(一块硬盘最多能分4个主分区).如hda1,表示第一块硬盘的第一个分区.hdb3表示第二块硬盘的第三个分区.还有如Pri ...

  10. Ckeditor上传图片返回的JS直接显示出来,未执行!!!

    Ckeditor上传图片网上有很多教程. 下面是我今天下午遇到的一个坑...自己挖的坑. 在conotroller里 我开始习惯性的 response.setContentType("app ...