`
brxonline
  • 浏览: 61570 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

UNIX编程(3)-文件IO

    博客分类:
  • C
阅读更多
1.open函数
#include <fcntl.h>
int open(const char *pathname, int oflag, .../*mode_t mode */);

oflag参数:
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR   读写打开
这三个必须指定一个

下面是可选的:
O_APPEND 每次写时都追加到文件的尾端
O_CREAT  若此文件不存在,则创建它
O_EXCL   如果同时指定了O_CREAT, 而文件已经存在,则会出错
O_TRUNC  如果此文件存在,而且为只写或读写成功打开,则将其长度截短为0
O_NOCTTY
O_NONBLOCK
O_DSYNC  使每次write等待物理I/O操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新
O_RSYNC   使每次一个以文件描述符作为参数的read操作等待,直至任何对文件同一  部分进行的未决写操作都完成
O_SYNC     使每次write等待物理I/O操作完成,包括由write操作引起的文件属性更新所需的IO
2.create函数
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
等价于 open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode);
3.close函数
关闭一个打开的文件
#include <unistd.h>
int close(int filedes);
4.lseek函数
#include <unistd.h>
off_t lseek(int filedes,  off_t offset, int whence);
whence取值说明:
SEEK_SET    则将该文件的偏移量设置为距文件开始处offset个字节
SEEK_CUR    则将该文件的偏移量设置为其当前值加offset,offset可正负
SEEK_END    则将该文件的偏移量设置为文件长度加offset,offset可正负

测试能否对标准输入设置偏移量
#include "apue.h"

int
main(void)
{
    if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1)
       printf("cannot seek\n");
    else
       printf("seek OK\n");
    exit(0);
}

创建一个具有空洞的文件
#include "apue.h"
#include <fcntl.h>

char    buf1[] = "abcdefghij";
char    buf2[] = "ABCDEFGHIJ";

int
main(void)
{
    int     fd;

    if ((fd = creat("file.hole", FILE_MODE)) < 0)
        err_sys("creat error");

    if (write(fd, buf1, 10) != 10)
        err_sys("buf1 write error");
    /* offset now = 10 */

    if (lseek(fd, 16384, SEEK_SET) == -1)
        err_sys("lseek error");
    /* offset now = 16384 */

    if (write(fd, buf2, 10) != 10)
        err_sys("buf2 write error");
    /* offset now = 16394 */

    exit(0);
}


5.read函数
#include <unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes);
6.write函数
#include <unistd.h>

ssize_t write(int filedes, const void *buf, size_t
nbytes);
将标准输入复制到标准输出
#include "apue.h"

#define BUFFSIZE 4096

int
main(void)
{
    int    n;
    char   buf[BUFFSIZE];

    while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if (write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");

    if (n < 0)
        err_sys("read error");

    exit(0);
}




7.pread和pwrite函数
#include <unistd.h>

ssize_t pread(int filedes, void *buf, size_t
nbytes, off_t offset);

ssize_t pwrite(int filedes, const void *buf,
size_t nbytes, off_t offset);
相当于顺序调用lseek和read或write,但pread和pwrite是原子操作

8.dup和dup2函数
复制一个现存的文件描述符

9.sync,fsync和fdatasync函数

#include <unistd.h>

int fsync(int filedes);

int fdatasync(int filedes);

void sync(void);
sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,并不等待实际写磁盘操作结束
fsync函数只对由文件描述符filedes指定单一文件起作用,并且等待写磁盘操作结束
fdatasync类似于fsync,但他只影响文件的数据部分。fsync还会同步更新文件的属性。

10.fcntl函数
#include <fcntl.h>

int fcntl(int filedes, int cmd, ... /* int arg */ );
cmd说明:
F_DUPFD  复制一个现有的描述符
F_GETFD  复制文件描述符
F_SETFD  设置文件描述符
F_GETFL  对应于filedes的文件状态标志作为函数值返回
F_SETFL  将文件状态标志设置为第三个参数值
F_GETOWN 取当前接受SIGIO和SIGURG信号的进程ID或进程组ID
F_SETOWN 设置接受SIGIO和SIGURG信号的进程ID或进程组ID
对于指定的描述符打印文件标志
#include "apue.h"
#include <fcntl.h>
int
main(int argc, char *argv[])
{

    int       val;

    if (argc != 2)
        err_quit("usage: a.out <descriptor#>");

    if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
        err_sys("fcntl error for fd %d", atoi(argv[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:
        err_dump("unknown access mode");
    }

    if (val & O_APPEND)
        printf(", append");
    if (val & O_NONBLOCK)
        printf(", nonblocking");
#if defined(O_SYNC)
    if (val & O_SYNC)
        printf(", synchronous writes");
#endif
#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC)
    if (val & O_FSYNC)
        printf(", synchronous writes");
#endif
    putchar('\n');
    exit(0);
}


对一个文件描述符打开一个或多个文件状态标志
#include "apue.h"
#include <fcntl.h>

void
set_fl(int fd, int flags) /* flags are file status flags to turn on */
{
    int     val;

    if ((val = fcntl(fd, F_GETFL, 0)) < 0)
        err_sys("fcntl F_GETFL error");

    val |= flags;       /* turn on flags */

    if (fcntl(fd, F_SETFL, val) < 0)
        err_sys("fcntl F_SETFL error");
}




11.ioctl函数
#include <unistd.h>        /* System V */
#include <sys/ioctl.h>     /* BSD and Linux */
#include <stropts.h>       /* XSI STREAMS */

int ioctl(int filedes, int request, ...);


ioctl函数是IO操作的杂物箱。
分享到:
评论

相关推荐

    Linux系统编程--文件IO1

    《TCP/IP 详解》(3卷),《UNIX网络编程》(2卷)参考书2:《Linux系统编程》RobertLoVe [美] 参考书3:《Linux/UNIX系统编

    高级编程笔记文件io/标准io.txt

    适用于编程初学者,不给你们看

    UNIX环境高级编程_第二版

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

    Unix系统编程(程序设计语言+系统调用)

    本课程主要讲述在Unix/Linux环境下高级编程的方法,其内容包括文件、信号、POSIX线程、UDP、WEB和客户机服务器等相关知识,并由浅入深讲述通信、并发和多线程编程的核心技术、实用技术。 前导课程: ①操作系统原理 ...

    linux网络编程-宋敬彬-part1

    第3章 文件系统简介 61 3.1 Linux下的文件系统 61 3.1.1 Linux下文件的内涵 61 3.1.2 文件系统的创建 62 3.1.3 挂接文件系统 64 3.1.4 索引节点inode 65 3.1.5 普通文件 66 3.1.6 设备文件 66 3.1.7...

    UNIX环境高级编程(上).rar

    03 文件IO.pdf 04 文件和目录.pdf 05 标准IO库.pdf 06 系统数据文件和信息.pdf 07 UNIX进程的环境.pdf 08 进程控制.pdf 09 进程关系.pdf 10 信号.pdf 11 终端IO.pdf 12 高级IO.pdf 13 精灵进程.pdf 14 ...

    UNIX环境高级编程

    关于c语音UNIX系统高级编程,涉及到UNIX主要的个方面。文件结构、IO库、进程管理里、进程间通讯的算法。学习UNIX环境高级编程的经典。

    UNIX高级环境编程

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用...

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

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

    linux 下 select 编程 librtspserver

    在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,服务器端断开连接。而客户端却不能及时知道,只有在客户输入完毕并发送到服务器的时候才知道连接已经断开,...

    linux 下 select 编程 librtspserver 文件

    linux 下 select 编程 librtspserver linux 下 select 编程 我们知道 select 是IO 多路复用的一个最简单支持,poll 和 epoll 是 select 的升级版。在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端...

    linux 下 select 编程 librtspserver.rar

    在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,服务器端断开连接。而客户端却不能及时知道,只有在客户输入完毕并发送到服务器的时候才知道连接已经断开,...

    rust-apue:UNIX环境中的高级编程。 Rust中的代码

    APUE手册中的程序(UNIX:registered:环境中的高级编程)。 进步 第1章:简介 第2章:无文件:() 第3章:fileio 第4章:filedir 去做 列表 TODO: ... 如何建造 export DYLD_LIBRARY_PATH=/Applications/Xcode...

    嵌入式Linux学习的示例程序以及项目

    04.IO(文件IO, 标准IO, UNIX环境编程代码) 05.process_threads(多进程和多线程编程代码) 06.network(网络编程代码) 07.linux_driver(led,按键,EEFPROM, LCD, 触摸屏代码) Apps(项目代码) docs(相关文档)

    入门学习Linux常用必会60个命令实例详解doc/txt

    在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分访问的。要访问CD-ROM上的文件,需要将CD-ROM设备挂装在文件树中的某个挂装点。如果发行版安装了自动挂装包,那么这个步骤可自动进行。在Linux...

    nuclei:主动式IO和运行时系统

    异步TCP,UDP,Unix域套接字和文件... proactor系统不会阻塞 分散/收集操作 最小分配 比其他任何运行时更具表现力 具有无锁编程的完全异步I / O系统 例子 请转到examples目录运行示例: $ cd examples $ cargo ...

    Linux读书笔记;推荐书籍.rar

    如果你想要成为一名合格的Linux管理员linux学习书籍,那么必须要学习一些基础知识和技能。...该书主要介绍Unix环境下高级编程的相关知识,如进程控制、信号处理、文件IO等。 3.《深入理解Linux内核》

    嵌入在Python的x86-64汇编器PeachPy.zip

    C 头文件生成的函数JSON 格式的函数元数据基于 Python 的元编程和代码生成多个指令流的复用(有助于软件流水线)兼容 Python 2 和 Python 3,CPython 和 PyPy在线 DEMO: PeachPy.IO 标签:PeachPy

    读懂Java中的Socket编程

     Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本。当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限。一旦IO操作对象被打开,那么这个用户进程可以对...

Global site tag (gtag.js) - Google Analytics