2015-09-27 42 views
-1

这是我的程序: 我对此感到困惑。我不明白为什么c1和c2分享相同的价值,但c3的价值是不同于c1和c2的?有人可以帮我解释一下吗?谢谢。下面是程序:有人可以帮我解释为什么下面的C程序(系统调用)有这种输出?

#include <stdio.h> 
#include <fcntl.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); 
return 0; 
} 
+3

您是否阅读过'dup2'的文档?你不了解它吗? – Mat

+0

我的意思是在调用dup2之后,fd2和fd3应该指向打开文件表中的同一个文件,那么我认为c2和c3应该共享相同的值而不是c1和c2 – user144600

回答

2

调用DUP2后,FD2相当于FD3,因此发生的事情是:

read(fd1, &c1, 1); 

您读取文件

read(fd2, &c2, 1); 

的第一个字符自fd2独立于fd1,它仍然在文件的开头,因此您再次读取文件的第一个字符

read(fd3, &c3, 1); 

由于fd3等同于dup2之后的fd2,因此当您调用read(fd2, &c2, 1);时,您已经读取了文件的第一个字符,现在它读取文件中的第二个字符。

这就是为什么前两个是相同的,因为它们是文件中的第一个字符,而第三个字符不同,因为它是文件中的第二个字符。

+0

哦,这很有道理,谢谢! – user144600

+0

Upvoted努力编写一步一步的解释 –

+1

@ user144600,如果它解决了您的问题,请upvote并接受此答案。它帮助每个人! –

相关问题