欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CSAPP学习日志之系统IO举例分析

程序员文章站 2022-06-29 18:54:22
...

有关系统IO的举例分析说明

  • 首先是一个关于IO重定向和只读的例子

#include "csapp.h"

int main(int argc, char *argv[])
{
    int fd1, fd2, fd3;
    char c1, c2, c3;
    char *fname = argv[1];
    fd1 = Open(fname, O_RDONLY, 0);
    fd2 = Open(fname, O_RDONLY, 0);
    fd3 = Open(fname, O_RDONLY, 0);
    dup2(fd2, fd3);

    Read(fd1, &c1, 1);
    Read(fd2, &c2, 1);
    Read(fd3, &c3, 1);
    printf("c1 = %c, c2 = %c, c3 = %c\n", c1, c2, c3);

    Close(fd1);
    Close(fd2);
    Close(fd3);
    return 0;
}

运行如下:

CSAPP学习日志之系统IO举例分析

abcde.txt中的内容为:

CSAPP学习日志之系统IO举例分析
关于dup2函数:

int dup2(int oldfd,int newfd);返回:若成功则为非负的描述符,若出错则为-1。
dup2函数复制描述符表表项oldfd到描述符表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开了,dup2会在复制oldfd之前关闭newfd。

代码分析
这段代码以只读方式打开了3次abcde.txt文件,并使用重定向dup2函数将描述符表项fd2复制到了fd3,覆盖了fd3。因此c1,c2的值都是在abcde.txt文件中读取的第一个字节a,fd1,fd2引用计数都为1;而dup2执行后fd3指向的内容被覆盖,并且现在指向fd2所指向的内容,所以fd3标准输出的数据重定向到fd2指向的文件,从fd2指向的文件中继续读数据,引用计数增加为2,c3的值为abcde.txt文件中读取的第二个字节b。

  • 然后是另一个IO重定向和写数据的例子

#include "csapp.h"

int main(int argc, char *argv[])
{
    int fd1, fd2, fd3;
    char *fname = argv[1];
    fd1 = Open(fname, O_CREAT|O_TRUNC|O_RDWR, S_IRUSR|S_IWUSR);
    Write(fd1, "pqrs", 4);	

    fd3 = Open(fname, O_APPEND|O_WRONLY, 0);
    Write(fd3, "jklmn", 5);
    fd2 = dup(fd1);  /* Allocates new descriptor */
    Write(fd2, "wxyz", 4);
    Write(fd3, "ef", 2);

    Close(fd1);
    Close(fd2);
    Close(fd3);
    return 0;
}

/*abcde.txt
pqrswxyzef
*/
运行如下:CSAPP学习日志之系统IO举例分析
此时abcde.txt中的内容变为:

CSAPP学习日志之系统IO举例分析
关于dup函数:

int dup(int oldfd);返回:若成功则为最小的未被使用的描述符,若出错则为-1。
dup函数复制描述符表表项oldfd所指的文件描述符产生一个新的文件描述符,返回的新的文件描述符和oldfd共享同一个文件打开表项。

代码分析:
这段代码首先以可读可写的方式打开文件(O_RDWR),如果文件不存在就创建一个它的空文件(O_CREAT),如果存在就截断清空它(O_TRUNC),这里清空原文件的内容并返回fd1,再写入pqrs四个字节,此时abcde.txt中的内容为pqrs。
然后以只写模式打开文件(O_WDONLY),设置文件位置在文件的结尾处并返回fd3,再写入jklmn五个字节,此时abcde.txt中的内容为pqrsjklmn。
再然后调用dup函数返回一个新的文件描述符fd2,它与fd1共享一个打开文件表项,再从第四个字节后面写入wxyz四个字节,因此覆盖了jklm,此时abcde.txt中的内容为pqrswxyzn。
最后在fd3指向的位置写入ef,此时abcde.txt中的内容为pqrswxyznef。