Linux System Programming 学习笔记(二) 文件I/O
1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024
2.打开文件
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, )
int fd = creat(filename, )
3.读文件
size_t readn(int fd, void* buf, size_t len)
{
size_t tmp = len;
ssize_t ret = ;
while (len != && (ret = read(fd, buf, len)) != ) {
if (ret == -) {
if (errno == EINTR) {
continue;
}
fprintf(stderr, "read error\n");
break;
}
len -= ret;
buf += ret;
}
return tmp - len;
}
4.写文件
size_t writen(int fd, void* buf, size_t len)
{
ssize_t ret = ;
size_t tmp = len;
while (len != && (ret = write(fd, buf, len)) != ) {
if (ret == -) {
if (errno == EINTR) {
continue;
}
fprintf(stderr, "write error\n");
break;
}
len -= ret;
buf += ret;
}
return tmp - len;
}
5.文件同步
int ret = fsync(fd);
open调用时 O_SYNC标志表示 文件必须同步
int fd = open(file, O_WRONLY | O_SYNC);
6.文件定位
7.截断文件
int ftruncate(int fd, off_t len);
将给定文件截断为给定长度,这里的给定长度是可以小于文件大小,也可以大于文件大小(会造成空洞)
8.多路I/O
Multiplexed I/O becomes the pivot point for the application,designed similarly to the following activity:
a. Multiplexed I/O : Tell me when any of these file descriptors becomes ready for I/O
b. Nothing ready? Sleep until one or more file descriptors are ready.
c. Woken up ! What is ready?
d. Handle all file descriptors ready for I/O, without bolocking
e. Go back to step a
9.select
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);
FD_CLR(int fd, fd_set* set); // removes a fd from a given set
FD_ISSET(int fd, fd_set* set); // test whether a fd is part of a given set
FD_SET(int fd, fd_set* set); // adds a fd to a given set
FD_ZERO(int fd, fd_set* set); // removes all fds from specified set. shoule be called before every invocation of select()
因为fd_set是静态分配的,系统有一个文件描述符的最大打开数 FD_SETSIZE,在Linux中,该值为 1024
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> #define TIMEOUT 5 /* select timeout in seconds */
#define BUFLEN 1024 /* read buffer in bytes */ int main(int argc, char* argv[])
{
struct timeval tv;
tv.tv_sec = TIMEOUT;
tv.tv_usec = ; /* wait on stdin for input */
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds); int ret = select(STDIN_FILENO + , &readfds, NULL, NULL, &tv);
if (ret == -) {
fprintf(stderr, "select error\n");
return ;
} else if (!ret) {
fprintf(stderr, "%d seconds elapsed.\n", TIMEOUT);
return ;
}
if (FD_ISSET(STDIN_FILENO, &readfds)) {
char buf[BUFLEN + ];
int len = read(STDIN_FILENO, buf, BUFLEN);
if (len == -) {
fprintf(stderr, "read error\n");
return ;
}
if (len != ) {
buf[BUFLEN] = '\0';
fprintf(stdout, "read:%s\n", buf);
}
return ;
} else {
fprintf(stderr, "This should not happen\n");
return ;
} }
10. poll
int poll(struct pollfd* fds, nfds_t nfds, int timeout);
This is a program that uses poll() to check whether a read from stdin and a write to stdout will block
#include <unistd.h>
#include <poll.h> #define TIMEOUT 5 int main(int argc, char* argv[])
{
struct pollfd fds[]; /* watch stdin for input */
fds[].fd = STDIN_FILENO;
fds[].events = POLLIN; /* watch stdout for alibity to write */
fds[].fd = STDOUT_FILENO;
fds[].events = POLLOUT; int ret = poll(fds, , TIMEOUT * );
if (ret == -) {
fprintf(stderr, "poll error\n");
return ;
} if (!ret) {
fprintf(stdout, "%d seconds elapsed.\n", TIMEOUT);
return ;
} if (fds[].revents & POLLIN) {
fprintf(stdout, "stdin is readable\n");
}
if (fds[].revents & POLLOUT) {
fprintf(stdout, "stdout is writable\n");
}
return ;
}
11.内核实现
Linux System Programming 学习笔记(二) 文件I/O的更多相关文章
- Linux System Programming 学习笔记(八) 文件和目录管理
1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...
- Linux System Programming 学习笔记(四) 高级I/O
1. Scatter/Gather I/O a single system call to read or write data between single data stream and mu ...
- Linux System Programming 学习笔记(一) 介绍
1. Linux系统编程的三大基石:系统调用.C语言库.C编译器 系统调用:内核向用户级程序提供服务的唯一接口.在i386中,用户级程序执行软件中断指令 INT n 之后切换至内核空间 用户程序通过寄 ...
- Linux System Programming 学习笔记(十一) 时间
1. 内核提供三种不同的方式来记录时间 Wall time (or real time):actual time and date in the real world Process time:the ...
- Linux System Programming 学习笔记(九) 内存管理
1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系 ...
- Linux System Programming 学习笔记(七) 线程
1. Threading is the creation and management of multiple units of execution within a single process 二 ...
- Linux System Programming 学习笔记(六) 进程调度
1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进 ...
- Linux System Programming 学习笔记(五) 进程管理
1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...
- Linux System Programming 学习笔记(三) 标准缓冲I/O
1. partial block operations are inefficient. The operating system has to “fix up” your I/O by ensuri ...
随机推荐
- 01_3_查询指定id的单个对象
01_3_查询指定id的单个对象 1. 映射文件配置如下信息 <select id="selectStudentById" resultClass="Student ...
- lua 使用递归查找键值
function cc.exports.findValueByTbl(tbl,key)--递归方法,用于查找tbl中对应的键值 for k,v in pairs(tbl) do if k == key ...
- NSURL初始化失败
服务端给返回的网页加载不出来,仔细一看,url是空的!!为什么呢. 示例: NSString *urlStr = @"http://服务器返回带有汉字的url字符串.com"; N ...
- Your Ride Is Here
纯粹的水题= = /* ID:yk652321 LANG:C++ TASK:ride */ #include<iostream> #include<cstring> #incl ...
- 【费用流】loj#545. 「LibreOJ β Round #7」小埋与游乐场
好像现在看来这个缩点的思路挺清晰啊 题目描述 有两个非负整数组成的可重集合 $A$ 和 $B$. 现在你可以对 $A$ 中至多 $k$ 个元素进行操作.操作方法为:设你准备操作且未被操作过的 $A$ ...
- DNS 工作原理是什么,域名劫持、域名欺骗、域名污染又是什么
DNS 工作原理是什么,域名劫持.域名欺骗.域名污染又是什么 2014年11月27日 10:05:40 阅读数:6726 标签: dns网络互联网顶级域名递归 更多 个人分类: 网络学习 一.DN ...
- SSH框架面试总结----1
1:struts2的工作流程 1)客户端浏览器发出HTTP请求. 2)根据web.xml配置,HTTP请求会被FilterDispatcher接收. 3)根据struts.xml,找到对应的Actio ...
- LeetCode之Weekly Contest 92
第一题:转置矩阵 问题: 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9] ...
- phpExcel使用方法二
require_once './phpexcel/PHPExcel.php'; // 首先创建一个新的对象 PHPExcel object $objPHPExcel = new PHPExcel(); ...
- Java-framework-Vaadin
安装vaadin: (1) 首先试了maven+vaadin. 安装maven: 1. unzip apache-maven-3.3.9-bin.zip 2. modify PATH environm ...