`
oolala
  • 浏览: 99710 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
09c341db-7f05-3f2b-a572-9ee69a5d8a77
unix环境高级编程
浏览量:21652
社区版块
存档分类
最新评论

Unix环境高级编程笔记:3、文件I/O

 
阅读更多
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环境高级编程压缩包包含这些内容: catalogue.txt src.3e.tar.gz(源码) UNIX环境高级编程(第2版)-中文.pdf 带目录 UNIX环境高级编程(第3版)-中文-mobi转换.pdf 带目录 UNIX环境高级编程(第3版)-中文.pdf 带...

    UNIX环境高级编程

    本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,...

    APUE(UNIX环境高级编程)——文件I/O篇

    本章开始讨论UNIX系统,先说明可用的文件I/O函数——打开文件、读文件、写文件等等。 大多数UNIX文件I/O只需用到5个函数: open read write lseek close 然后说明不同缓存器长度对read和write函数的影响。本章所...

    UNIX环境高级编程第二版

    第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 ...

    unix环境高级编程.rar

    unix环境高级编程 pdf高清无水印 第1章 UNIX基础知识 1 第2章 UNIX标准化及实现 17 第3章 文件I/O 35 第4章 文件和目录 54 第5章 标准I/O库 91 第6章 系统数据文件和信息 110 第7章 UNIX进程的环境 122 第8章 进程...

    unix环境高级编程

    第3章 文件I/O 第四章〓文件和目录 第五章〓标准I/O库 第六章〓系统数据文件和信息 第七章〓Unix进程的环境 第八章〓进程控制 第九章〓进程关系 第十章:信号 第11章 终端I/O 第十二章 高级I/O 第十三章 精灵进程 第...

    Unix环境高级编程pdf高清版

    Unix环境高级编程 高清电子版,Unix学习经典书籍,程序员必读

    Unix环境高级编程_UNIX环境高级编程_

    Unix环境高级编程 Unix环境高级编程

    UNIX环境高级编程-pdf

    UNIX环境高级编程-pdf UNIX环境高级编程-pdf UNIX环境高级编程-pdf

    UNIX环境高级编程(中文第三版)

    UNIX环境高级编程(中文第三版)UNIX环境高级编程(中文第三版)UNIX环境高级编程(中文第三版)UNIX环境高级编程(中文第三版)

    UNIX环境高级编程.pdf

    第3章文件I / O 第4章文件和目录 第5章标准I/O 库 第6章系统数据文件和信息 第7章U N I X进程的环境 第8章进程控制 第9章进程关系 第10章信号 第11章终端I / O 第1 2章高级I / O 第1 3章精灵进程 第1 4章进程间通信 ...

    Unix I/O 小结

    对Unix的各种i/o进行了小结,从底层的系统调用,到stdio,到高级i/o

    UNIX环境高级编程 学习笔记

    学习LINUX环境编程的见证,一笔一画,脉络清楚,结构清晰,自己再看一目了然,传上来与众分享

    UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程

    UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程

    UNIX环境高级编程-源代码

    本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,...

    UNIX环境高级编程(中文版+英文版+源代码)

    第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 ...

    UNIX环境高级编程课后习题详细解答

    Unix环境高级编程 详细课后习题解答 内容高清 详细可参考unix环境高级编程来看

Global site tag (gtag.js) - Google Analytics