大佬教程收集整理的这篇文章主要介绍了1.文件描述符、文件句柄和打开文件之间的关系,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
两三个月前试着读过这本书c;感觉像啃石头。今天终于又下定决心来啃它c;体验比之前好多了。 但是书里的东西c;还是比较抽象c;一下子看不明白c;所以准备对学习过程做个记录。
这是第一篇c;以后再碰到难点会继续记录。
P76~P79 76、77草草看过去c;不甚求解c;只记得P78的一条要点:
两个不同的文件描述符c;若指向同一打开文件句柄c;将共享同一文件偏移量。因此c;如果通过其中一个描述符来修改文件偏移量(由调用read()、write()、或lseek()所致)c;那么从另一文件描述符中也会观察到这一变化。无论这两个文件描述符分属于不同进程c;还是同属于一个进程c;情况都是如此。
但是78页又讲到:
仅仅简单地打开results.log文件来两次是远远不够的(第一次在描述符1上打开c;第二次在描述符2上打开)。首先两个文件描述符不能共享相同的文件偏移量指针c;因此有可能相互覆盖彼此的输出。在这打开的文件不一定就是磁盘文件。
看懂这张图很重要
区别在于书上那段话:在进程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;总之就是三条规则:
cat@H_675_109@ tmp.txt
123456789ABCDEFGHIJKLMN
#@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
.@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
以上是大佬教程为你收集整理的1.文件描述符、文件句柄和打开文件之间的关系全部内容,希望文章能够帮你解决1.文件描述符、文件句柄和打开文件之间的关系所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。