Linux系统编程001--系统IO
1. 文件系统:用来存储、组织、管理文件的一套方式、协议
2. 文件
- 文件的属性:i-node唯一表示一个文件的存在与否
- 文件的内容
3. Linux系统如何实现文件的操作?
点击查看代码
硬件层:
inode(属性)--->文件的内容
Linux内核:
struct inode{}用来描述一个文件的屋里inode的信息【链表保存】,系统识别到一个文件的存在,
就会为它创建一个struct inode,一个文件只会唯一对应一个struct inode
struct file{}用来描述一个已经打开的文件:
文件状态标记(如:O_RDONLY、O_WRONLY......)
文件的偏移量/offset(类似“光标”)
struct inode*
每一个打开的文件都会对应一个struct file
一个文件可以被多个不同的进程打开,一个进程也可以打开多个文件
操作文件的过程:
struct file---> struct inode--->硬件上面的inode--->文件的内容
linux为了屏蔽文件操作的具体细节,为每一个进程创建一个“进程文件表项”,保存每一个进程打开的文件的 struct file* 的数组
struct file*fds[]
0 struct file*--->struct inode......
1 struct file*--->struct inode......
......
linux再提供操作文件的函数接口:
fd = open()
打开一个指定的文件,返回“进程文件表项”的下标,
int "文件描述符":在linux应用中,用来描述一个已经打开的文件,每一个打开的文件都有有个唯一的id,后续操作这个文件,
都是通过这个id操作该文件
read(fd)
write(fd)
close(fd)
......
linux系统提供的这些用于操作文件的接口函数(open,read.....),我们称为“系统IO”
系统IO:操作系统提供的对文件的输入输出的接口
4.linux"系统IO"的使用
- 打开文件 open
点击查看代码
NAME
open, openat, creat - open and possibly create a file
打开或者创建(创建并打开)一个文件
SYNOPSIS
#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);
pathname:要打开或者创建的文件名,带路径(不带路径表示当前路径)
flags:打开文件的标记
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
以上三个标记只能选一个(文件的打开方式)
O_APPEND:追加标记,打开文件后,文件的偏移量会在文件的末尾。(默认情况下,读和写的 标记在文件的开头)
O_CREAT:创建标记,如果不存在,则创建文件
O_EXCL:该标记一般和O_CREAT配合使用,用来测试文件是否存在
如果指定O_CREAT | O_EXCL,并且文件存在,则open会失败,并且errno设置为 EEXIST,表示文件已存在
O_TRUNC:truncate 截短,清除文件内容
O_NONBLOCK:非阻塞方式打开文件
非阻塞:不等待
如果文件没有内容,read不会等待,直接返回一个错误
如果文件没有空间了,write不会阻塞,直接返回一个错误
阻塞:等待
如果文件没有内容,read会等待(直到有数据或出错)
如果文件没有空间了,write会阻塞,(直到有空间或出错)
。。。。。。
多个标记使用“|”链接(标记是使用位域实现的)
O_RDWR | O_CREAT | O_TRUNC
mode:指定创建的文件的权限,当第二个参数带有O_CREAT时,指定创建的文件的权限
返回值:成功打开一个文件,返回打开文件的文件描述符(>2 && int(下标))
操作系统会自动为每一个进程打开三个文件:
标准输入文件:文件描述符 STDIN_FILENO (0)
标准输出文件:文件描述符 STDOUT_FILENO (1)
标准出错文件:文件描述符 STDERR_FILENO (2)
失败返回-1,同时errno被设置
errno是一个全局变量,是用来保存最后一个出错的错误码
头文件: #include<srrno.h>
路径:/usr/include/errno.h
perror 把错误码对应的错误字符串打印出来
perro("user indi");
user indi:用户自己的提示信息
打印出来的形式:用户自己的提示信息:系统错误码的提示信息
int creat(const char *pathname, mode_t mode);
- 对文件的操作(读、写...)
- 关闭文件
Linux系统编程001--系统IO的更多相关文章
- linux c编程调用系统的动态库时,要使用dlopen等函数吗?
同问 linux c编程调用系统的动态库时,要使用dlopen等函数吗? 2012-11-27 21:55 提问者: hnwlxyzhl 我来帮他解答 满意回答 2012-12-07 09:08 li ...
- UNIX系统编程:文件IO(I)
1.标准C库中访问文件用的是文件指针FILE *(stdin,stdout,stderr):对于linux系统编程而言,所有对设备或文件的操作都是通过文件描述符进行的 2.当打开或者创建一个文件的时候 ...
- Linux系统编程:简单文件IO操作
使用Linux的文件API,经常看见一个东西,叫做文件描述符. 什么是文件描述符? (1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在 ...
- linux系统编程之文件IO
1.打开文件的函数open,第一个参数表示文件路径名,第二个为打开标记,第三个为文件权限 代码: #include <sys/types.h> #include <sys/stat. ...
- linux c编程:系统数据文件和信息
linux系统相关的文件信息包含在/etc/passwd文件和/etc/group中.每次登录linux系统以及每次执行ls -l命令时都要使用口令文件.这些字段都包含在<pwd.h>中定 ...
- Linux网络编程2——系统函数
socket信息数据结构 #include <netinet/in.h> struct sockaddr { unsigned short sa_family; /*地址族*/ ]; /* ...
- linux网络编程、系统编程
http://blog.csdn.net/lianghe_work/article/category/2871247
- linux c编程:标准IO库
前面介绍对文件进行操作的时候,使用的是open,read,write函数.这一章将要介绍基于流的文件操作方法:fopen,fread,fwrite.这两种方式的区别是什么呢.1种是缓冲文件系统,一种是 ...
- 【Linux 应用编程】文件IO操作 - 常用函数
Linux 系统中的各种输入输出,设计为"一切皆文件".各种各样的IO统一用文件形式访问. 文件类型及基本操作 Linux 系统的大部分系统资源都以文件形式提供给用户读写.这些文件 ...
随机推荐
- Unsupported major.minor version 52.0 (unable to load class org.apache.kafka.clients.producer.Produce异常解决方法
在控制台输入java -version,查看自己的版本是多少,我的查出来是1.8的.随后将服务器上的改为1.8的就可以了.
- Gitlab分支策略建议指南
本文分支策略为总结各中小型企业常见做法(仅代表个人观点),在下才疏学浅,文章如有缺漏或不当之处,望各位帮忙指正.写此文也十分希望能起抛砖引玉之效. 据我所知,目前大部分无论是按瀑布/敏捷开发模型,就算 ...
- PTA(BasicLevel)-1013 数素数
一.问题描述 令 Pi 表示第 i 个素数.现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数. 输出格式:输入在一行中给出 M 和 N,其间以空格分隔. 输 ...
- CADisplayLink、NSTimer循环引用解决方案
前言:CADisplayLink.NSTimer 循环引用问题 CADisplayLink.NSTimer会对Target产生强引用,如果target又对他们产生强引用,那么就会引发循环引用. @ ...
- labview入门到出家10(进阶)——CAN通讯
讲完串口,这边再讲一个labveiw工控程序中比较常用的CAN通讯吧.很久没有写过CAN通讯的程序了,网上一搜就是什么现场总线,控制器局域网总线,然后一堆复杂的协议.在这里还是一 ...
- go-zero微服务实战系列(十一、大结局)
本篇是整个系列的最后一篇了,本来打算在系列的最后一两篇写一下关于k8s部署相关的内容,在构思的过程中觉得自己对k8s知识的掌握还很不足,在自己没有理解掌握的前提下我觉得也很难写出自己满意的文章,大家看 ...
- buu第二页
33.被劫持的神秘礼物 打开后直接搜索HTTP,发现了以POST方式提交的数据,追踪HTTP流,根据题目提示,把name和word拼在一起 再根据题目提示,用MD5解密 这样就得到了flag 34.刷 ...
- abstract,抽象修饰符
//abstract 抽象类:类由extends继承继承表现在单继承(接口可以多继承)//abstract--约束~~有人帮我们实现抽象方法,只有方法名字,没有方法实现1.不能靠new这个抽象类,只靠 ...
- HCNP Routing&Switching之BFD
BFD技术背景 什么是BFD?它的主要作用是做什么的,这是我们学习BFD需要搞清楚的地方: BFD是Bidirectional Forwarding Detection的缩写,翻译成中文就是双向转发检 ...
- 前端-关于CORS跨域的解决方案,面向服务端
最近自己在写后台管理系统的时候,并没有采用jsp.freemaker.叶子等模板技术,而是由后端提供数据api,前端通过AJAX和JQuery来动态操作页面上的一些div.table元素,从而实现报表 ...