编程语言   发布时间:2022-06-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了1.文件描述符、文件句柄和打开文件之间的关系大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

专栏说明

  两三个月前试着读过这本书࿰c;感觉像啃石头。今天终于又下定决心来啃它࿰c;体验比之前好多了。   但是书里的东西࿰c;还是比较抽象࿰c;一下子看不明白࿰c;所以准备对学习过程做个记录。

这是第一篇࿰c;以后再碰到难点会继续记录。

文章目录

  • 专栏说明
  • 起因
  • 经过
  • 结果
  • 示例
    • dup()
    • open()

起因

P76~P79 76、77草草看过去࿰c;不甚求解࿰c;只记得P78的一条要点:

两个不同的文件描述符࿰c;若指向同一打开文件句柄࿰c;共享同一文件偏移量。因此࿰c;如果通过其中一个描述符来修改文件偏移量(由调用read()、write()、或lseek()所致)࿰c;那么从另一文件描述符中也会观察到这一变化。无论这两个文件描述符分属于不同进程࿰c;还是同属于一个进程࿰c;情况都是如此。

但是78页又讲到:

仅仅简单地打开results.log文件来两次是远远不够的(第一次在描述符1上打开࿰c;第二次在描述符2上打开)。首先两个文件描述符不能共享相同的文件偏移量指针c;因此有可能相互覆盖彼此的输出。在这打开的文件不一定就是磁盘文件。

经过

刚看到挺懵逼的。😦 又从头看了一遍࿰c;发现了重点:

  • 进程级的文件描述符表(文件描述符)
  • 系统级的打开文件表(文件句柄)
  • 文件系统的i-node表 这三个东西不是一回事。

看懂这张图很重要

1.文件描述符、文件句柄和打开文件之间的关系

区别在于书上那段话:

   在进程A中࿰c;文件描述符1和20都指向同一个打开的文件句柄(标号为23)。这可能是通过调用dup()、dup2()或fcntl()而形成的(参见5.5节)。   进程A的文件描述符2和进程B的文件描述符2都指向同一个打开的文件句柄(标号73)。这种情形可能在调用fork()后出现(即࿰c;进程A与进程B之间是父子关系)࿰c;或者当某进程通过UNIX域套接字将一个打开的文件描述符传递给另一个进程时࿰c;会发生(参见61.13.3节)。   此外࿰c;进程A的描述符0和进程B的描述符3分别指向不同的打开文件句柄c;但这些句柄均指向i-node表中的相同条目1976)࿰c;换言之࿰c;指向同一文件。发生这种情况是因为每个进程各自对同一文件发起了open()调用。同一个进程两次打开同一文件也会发生类似情况。

结果

看到这里才明白࿰c;总之就是三条规则:

  1. 指向同一文件句柄的文件描述符共享同一文件偏移量(必定也指向同一个i-node条目࿰c;也即是同一文件)。
  2. open()两次打开的描述符不指向同一文件句柄(也就是文件偏移量不相同)。
  3. dup()、dup2()复制的文件描述符指向同一文件句柄(也就是文件偏移量相同)。

示例

cat@H_675_109@ tmp.txt

123456789ABCDEFGHIJKLMN

dup()

#@H_675_109@include@H_675_109@ <stdio.h>@H_675_109@@H_675_109@
#@H_675_109@include@H_675_109@ <unistd.h>@H_675_109@@H_675_109@
#@H_675_109@include@H_675_109@ <fcntl.h>@H_675_109@@H_675_109@
int@H_675_109@ @H_147_108@main@H_675_109@(@H_675_109@void@H_675_109@)@H_675_109@
{@H_675_109@
    const@H_675_109@ char@H_675_109@ filename[@H_675_109@]@H_675_109@=@H_675_109@"tmp.txt"@H_675_109@;@H_675_109@

    int@H_675_109@ fd_1 =@H_675_109@ open@H_675_109@(@H_675_109@filename,@H_675_109@ O_RDONLY)@H_675_109@,@H_675_109@
        fd_2 =@H_675_109@ dup@H_675_109@(@H_675_109@fd_1)@H_675_109@;@H_675_109@//copy the fd_1 by dup()@H_675_109@
    char@H_675_109@ buf [@H_675_109@@H_474_197@1024@H_675_109@]@H_675_109@;@H_675_109@

    ssize_t@H_675_109@ numRead;@H_675_109@
    numRead =@H_675_109@ read@H_675_109@(@H_675_109@fd_1,@H_675_109@ buf,@H_675_109@ @H_474_197@10@H_675_109@)@H_675_109@;@H_675_109@
    buf[@H_675_109@numRead]@H_675_109@=@H_675_109@''@H_675_109@;@H_675_109@
    printf@H_675_109@(@H_675_109@"numRead: %zdn"@H_675_109@,@H_675_109@numRead )@H_675_109@;@H_675_109@
    printf@H_675_109@(@H_675_109@"%sn"@H_675_109@,@H_675_109@ buf)@H_675_109@;@H_675_109@

    numRead =@H_675_109@ read@H_675_109@(@H_675_109@fd_2,@H_675_109@ buf,@H_675_109@ @H_474_197@10@H_675_109@)@H_675_109@;@H_675_109@
    buf[@H_675_109@numRead]@H_675_109@=@H_675_109@''@H_675_109@;@H_675_109@
    printf@H_675_109@(@H_675_109@"numRead: %zdn"@H_675_109@,@H_675_109@ numRead)@H_675_109@;@H_675_109@
    printf@H_675_109@(@H_675_109@"%sn"@H_675_109@,@H_675_109@ buf)@H_675_109@;@H_675_109@
	
    printf@H_675_109@(@H_675_109@"fd_1:%dn"@H_675_109@,@H_675_109@ close@H_675_109@(@H_675_109@fd_1)@H_675_109@)@H_675_109@;@H_675_109@
    printf@H_675_109@(@H_675_109@"fd_2:%dn"@H_675_109@,@H_675_109@ close@H_675_109@(@H_675_109@fd_2)@H_675_109@)@H_675_109@;@H_675_109@

}@H_675_109@
result:
	numRead: @H_474_197@10@H_675_109@
	123456789A
	numRead: @H_474_197@10@H_675_109@
	BCDEFGHIJK
	fd_1:0
	fd_2:0

open()

	.@H_675_109@.@H_675_109@.@H_675_109@/*same as above*/@H_675_109@
		
    int@H_675_109@ fd_1 =@H_675_109@ open@H_675_109@(@H_675_109@filename,@H_675_109@ O_RDONLY)@H_675_109@,@H_675_109@
        fd_2 =@H_675_109@ open@H_675_109@(@H_675_109@filename,@H_675_109@ O_RDONLY)@H_675_109@;@H_675_109@
				//reopen the file@H_675_109@

	.@H_675_109@.@H_675_109@.@H_675_109@/*same as above*/@H_675_109@
result:
	numRead: @H_474_197@10@H_675_109@
	123456789A
	numRead: @H_474_197@10@H_675_109@
	123456789A
	fd_1:0
	fd_2:0

初学者࿰c;如有理解错误之处࿰c;还望大佬多多指正。😃

大佬总结

以上是大佬教程为你收集整理的1.文件描述符、文件句柄和打开文件之间的关系全部内容,希望文章能够帮你解决1.文件描述符、文件句柄和打开文件之间的关系所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。