1、文件io需求5个函数
open read write lseek close
这些函数被称为不带缓冲的IO,不带缓冲IO指的是每个read和write都调用内核中的系统调用
只要涉及多个进程间共享资源,原子操作的概念就变的非常重要。
dup、fcntl、sync、fsync、ioctl
2、文件描述符
文件描述符是一个非负整数,当打开一个现有的文件或创建一个新文件时,内核向进程返回一个文件描述符。
<unistd.h>
0 标准输入 STDIN_FILENO
1 标准输出 STDOUT_FILENO
2 标准出错输出 STDERR_FILENO
3、open
open函数可以打开或创建一个文件
#include <fcntl.h>
int open(const char * pathname,int oflag,.../*mode_t mode*/);
oflag参数说明此函数多个选项,用下面一个或多个常量进行“或”运算构成oflag参数 <fcntl.h>
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_APPEND 写时追加到文件尾端
O_CREAT 或此文件不存在则创建。使用此选项,需要第三个参数mode,用其指定新文件的访问权限位
O_EXCL
O_TRUNC 如果此文件存在,而且为只写或读写成功打开,则将其长度截短为0
O_NOCTTY
O_NONBLOCK 设置非阻塞IO
4、 creat
#include <fcntl.h>
int creat(const char * pathname,mode_t mode);
5、close
#include <unistd.h>
int close(int fildes); 成功0,出错-1
6、lseek
按系统默认情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0
lseek显式的为一个打开的文件设置其偏移量
off_t lseek(int fildes,off_t offset,int whence);
whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可为正或负
whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可为正或负
7、read
#include<unistd.h>
ssize_t read(int filedes,void *buf,size_t nbytes) 成功返回读到的字节数,已到文件结尾返回0,出错返回-1
8、write
#include<unistd.h>
ssize_t write(int filedes,const void *buf,size_t nbyes); 成功则返回已写的字节数,若出错则返回-1
stdin.c 标准输入写到标准输出
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFER_SIZE 4096
int main(int argc, char **argv) {
char buffer[BUFFER_SIZE];
int n;
while ((n = read(STDIN_FILENO, buffer, BUFFER_SIZE)) > 0) {
if (write(STDOUT_FILENO, buffer, n) != n) {
printf("write error");
exit(1);
}
}
if (n < 0) {
printf("read error");
exit(1);
}
exit(0);
}
|
9、dup dup2
#include <unistd.h>
int dup(int fileds);
int dup2(int files,int files2);
dup返回的新文件描述符一定是当前可用的文件描述符中最小的值。dup2可以用fileds2参数指定新描述符的数值
当此函数执行时,二个描述符指向同一个文件表项,所以他们共享同一文件状态标志(读 写 添加)以及同一个文件偏移量。
10、fsync fdatasync sync
为保证磁盘上的实际文件与缓冲区内容的一致性
11、fcntl
#include<fcntl.h>
int fcntl(int filedes,int cmd,.../*int arg*/);
fcntl函数有5种功能
a)复制一个现有的描述符(cmd=F_DUPFD)
b)获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
c)获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)
d)获得/设置异步IO所有权(cmd=F_GETOWN或F_SETOWN)
e)获得/设置记录锁(cmd=F_GETTLK、F_SETLK、F_SETLKW)
fcntl文件状态标志
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_APPEND 写时追加到文件尾端
O_CREAT 或此文件不存在则创建。使用此选项,需要第三个参数mode,用其指定新文件的访问权限位
O_EXCL
O_TRUNC 如果此文件存在,而且为只写或读写成功打开,则将其长度截短为0
O_NOCTTY
O_NONBLOCK 设置非阻塞IO
fcntl.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int val;
if(argc !=2) {
printf("argc !=2\n");
exit(1);
}
if((val = fcntl(atoi(argv[1]),F_GETFL,0)) < 0) {
printf("fcntl error");
exit(1);
}
switch (val & O_ACCMODE) {
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
printf("unknow acces mode");
}
if(val & O_APPEND)
printf("append");
if(val & O_NONBLOCK)
printf("nonblocking");
#if defined (O_SYNC)
if(val & O_SYNC)
printf("synchronous");
#endif
putchar('\n');
exit(0);
}
|
12、ioctl
ioct函数是io操作的杂物箱,不能使用本中其他函数表示的io操作通用都能用ioctl表示。终端io是ioctl的最大使用方面。
13、/dev/fd
/dev/fd目录,其目录项是名为0、1、2等文件,打开文件/dev/fd/n 等效于复制描述符n
fd = open("/dev/fd/0",mode);
等效于fd = dup(0)
所以描述符0和fd共享同一文件表项,例如,描述符0先前被打开为只读,那么我们也只能对fd进行只读操作
相关推荐
### UNIX环境高级编程知识点 ...这些知识点涵盖了UNIX系统的各个方面,从基础的文件操作到高级的进程管理和文件I/O,以及标准实现和兼容性问题,为读者提供了一个全面理解UNIX环境高级编程的基础。
#### 第三章 文件I/O - **文件描述符**:解释文件描述符的作用和使用方法。 - **打开文件**:介绍`open`函数的参数和返回值,以及打开文件的模式。 - **创建新文件**:使用`creat`函数创建新文件,并设置初始权限。...
### APUE读书笔记《UNIX环境高级编程第二版》知识点概览 #### 第一章 Unix基础 **1. Unix手册页** - 手册页是Unix系统中查询命令、函数等帮助文档的方式。 - 分类包括命令(1)、系统调用(2)、库函数(3)、特殊...
《UNIX环境高级编程第二版》是一本深入探讨UNIX操作系统下高级编程技术的专著,尤其适合于对UNIX系统有深入了解需求的程序员、系统管理员以及计算机科学领域的学生和研究人员。本书的高清电子书版本,提供了清晰的...
### UNIX高级编程知识点详解 #### 一、课程体系与学习目标概述 - **语言**: 本课程主要聚焦于两种主流的编程语言:C 和 C++。 - **算法**: 学习经典算法及其优化方法,提高解决复杂问题的能力。 - **数据结构**: ...
通过以上内容,我们可以了解到Unix系统编程涉及到多个方面的知识,从操作系统的基本概念到具体的文件操作、进程管理等高级主题。掌握这些知识点对于深入理解Unix系统的工作原理以及编写高质量的应用程序至关重要。
这本书详细介绍了UNIX系统编程的高级特性,包括文件I/O、进程控制、信号处理、线程以及网络编程等方面的知识。 1. Unix基础:本部分涵盖了UNIX系统的基础知识,如系统手册页的使用、系统调用与库函数、文件和目录的...
4. **I/O模型**:UNIX提供了多种I/O模型,包括同步阻塞、同步非阻塞、异步I/O以及选择器(select/poll/epoll)等。这些模型在处理大量并发I/O时有着不同的效率和使用场景。 5. **进程间通信(IPC)**:包括管道...
3. **文件系统和I/O操作**:讨论文件描述符、打开/关闭文件、读写文件、标准输入输出以及文件权限等。 4. **网络编程**:讲解TCP/IP协议栈和套接字API,如何创建服务器和客户端应用程序。 5. **系统调用和库函数**...
3. C语言高级概念:包括指针、结构体、联合体、枚举、文件操作等,这些都是C语言的核心特性,特别是在Unix系统中,熟练掌握这些内容能让你更好地进行系统级编程。 4. Unix系统调用:Unix提供了丰富的系统调用接口,...
尚观Linux内核驱动开发笔记不仅涵盖了这些基础知识,还可能包含实践案例、常见问题解析以及高级技术探讨,例如异步I/O、内存管理优化、多线程同步等。通过学习和实践这些内容,开发者可以提升在Linux平台上的系统...
在深入探讨《LINUX与UNIX SHELL编程指南》的读书笔记之前,让我们首先理解Linux和Unix Shell编程的基础概念。Linux是一种自由开源的操作系统,它的内核由林纳斯·托瓦兹开发,而Unix则是一个历史悠久的多用户、多...
文件I/O操作 - **文件操作API**:Linux提供了丰富的文件操作API,如open()、read()、write()、close()等。 - **文件描述符**:每一个打开的文件都会被分配一个文件描述符,它是非负整数。 - **缓冲机制**:为了提高...
#### 第三章 文件I/O **1. 文件描述符** 文件描述符是一个非负整数,用于标识一个打开的文件。 **2. 打开文件:open函数** `open`函数用于打开或创建一个文件,返回一个文件描述符。 **3. 创建新文件:creat函数*...
在Unix环境下,程序的输入输出操作可以使用标准I/O库,进程间通信通过信号进行,错误处理通常通过异常处理机制实现,用户标识用于权限控制,而信号则提供了一种进程间同步和异步通知的方式。Unix时间值涉及到时间戳...
UNIX编程主要涉及系统调用,如进程控制、文件I/O、网络通信等。通过学习`fork`、`exec`、`pipe`、`socket`等函数,开发者可以创建多进程、多线程的程序,并进行进程间通信。Windows编程则涉及到API函数,如...
UNIX系统编程是C语言的重要应用领域,涉及到系统调用、文件I/O、进程和线程管理等内容。学习UNIX C笔记可以深入理解操作系统原理,提升系统级编程能力。 1. **系统调用**:如open、read、write、close用于文件操作...