zoukankan      html  css  js  c++  java
  • 《APUE》第三章笔记(1)

    以下内容是我看《APUE》第二版第三章的笔记,有错还希望指出来,谢谢。

    unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输入输出函数,而unbuffered I/O就是POSIX下的函数。

    文件描述符个人理解就相当于Linux下的UID,GID那样具有系统标识性的数字。系统对哪个哪个文件操作主要认的就是文件描述符。按照惯例,在UNIX的shell下,0代表标准输入,1代表标准输出,2就代表标准出错输出。在遵从POSIX的应用程序下,0就定义成STDIN_FILENO,1定义成STDOUT_FILENO,2定义成STDERR_FILENO。这些常量都定义在头文件<unistd.h>。早期的UNIX最多允许同时打开20个文件,现在则增加至63个。

    无缓冲IO主要操作的几个函数是open,read,write,lseek,close。接下来稍微的说以下这几个函数的用法。

    open函数:

     调用open函数可以打开或创建一个文件。

     #include <fcntl.h>

     int open(const char *pathname, int oflag, ... /* mode_t mode */);

     返回值:若成功则返回文件描述符,出错则返回-1

     当需要创建一个新文件的时候才需要用到第三个参数mode,用来制定权限(因为我现在看到第三章,而权限在第四章才讲,虽然我也知道,但是还是留到写第四章的笔记的时候再说明吧)。

    pathname是要打开或创建文件的名字,相对绝对路径什么的应该都懂吧。

    oflag参数可以说明怎么打开这个文件。用下列一个或多个常量进行“或“运算来构成oflag参数。(这些常量定义在<fcntl.h>头文件中)。

    O_RDONLY    只读打开(0)

    O_WRONLY   只写打开(1)

    O_RDWR        读、写打开(2)

    上述参数必须也只能指定一个,下列常量则是可选的:

    O_APPEND     在文件的末尾段追写

    O_CREAT        若文件不存在,则创建它。需要用到第三个参数model

    O_EXCL          

    O_TRUNC       如果此文件存在,而且为只写或读写成功打开,就将它的长度截断为0(就是清空文件内容分吧)

    O_NOCTTY     如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。(额,现在暂时看不太懂,懂的朋友可以跟我解释一下,谢谢。)

    O_NONBLOCK (完全不懂就不写了,等到时候用上在补回)

    下面的三个选项也是可选的,是关于同步输入和输出的,有兴趣可google一下:

    O_DSNYC

    O_RSNYC

    O_SNYC


    如果pathname太长的话,早期的系统V版本(如SVR2)会直接截掉,而且不给出任何信息;而BSD类的系统则会返回出错状态,并将errno设置为ENAMETOOLONG。


    creat函数

    也可以调用creat函数来创建一个新文件。

    #include <fcntl.h>

    int creat(const char *pathname, mode_t mode);

    返回值:成功返回文件描述符,出错返回-1

    此函数等效于:

    open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);


    close函数

    可调用close函数关闭一个打开的文件

    #include <unistd.h>

    int close(int filedes);

    返回值:成功返回0,出错返回-1


    lseek函数

    每一个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数。

    通常,读、写操作都是从当前文件偏移量开始的,并使偏移量增加所读写的字节数。默认情况下,除非是追尾操作,一般偏移量都设置为0.

    #include <unistd.h>

    off_t lseek(int filedes, off_t offset, int whence);

    返回值:若成功则返回新的文件偏移量,出错返回-1

    若whence是SEEK_SET(0),则将该文件的偏移量设置为据文件开始处的offset个字节。

    若whence是SEEK_CUR(1),则将该文件的偏移量设置为其当前值加offset,offset可正可负。

    若whence是SEEK_END(2),则将该文件的偏移量设置为文件长度加offset,offset可正可负。


    要是文件偏移量超过本身文件的长度的话,就会形成空洞文件。

    这是书上的例子:

    /* Create a file wtih a hole in it */
    #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);
    
    }
    用od -c 命令来查看:


    虽然我现在还是觉得有点不太懂,但是以后应该会遇到吧。


    第三章笔记待续。



  • 相关阅读:
    Android NDK Downloads
    Download Blackarch Linux
    Download Kali Linux
    Download ubuntu Linux
    cocos2D-X 常见49种Action
    win10 快速访问存在 2345Downloads 删除解决方案
    C++ 短信验证码/通知
    windows 登陆服务器
    使用路由器的虚拟服务器
    C++:查找字符串字串并替换
  • 原文地址:https://www.cnblogs.com/fusae-blog/p/4256797.html
Copyright © 2011-2022 走看看