CSAPP学习日志之系统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;
}
运行如下:
abcde.txt中的内容为:
关于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。
#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
*/
运行如下:
此时abcde.txt中的内容变为:
关于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。
上一篇: JS-16-数组高级API
下一篇: js中数组高级API中
推荐阅读