第501页,Figure 15.6

在程序的第46行有dup2(fd[0], STDIN_FILENO),由于忘记了这个函数,于是翻到前面76页,有这样一段话:

dup2(fildes, fildes2);

If fildes is equal to fildes2, the dup2() function returns fildes2 without closing it.

英语比较差,发现了2个问题:

1、这个“it”到底是代表fildes呢?还是filedes2呢?

2、如果fildes不等于fildes2,即正常情况下到底关不关闭呢?

书上没有说清楚。于是google之,找到了这篇文章,第三段代码下面有这一段话:“dup2函数在复制了oldfd之后,会立即将其关闭”。本来以为万事大吉了,但是随后发现这句话是错的

用一个简单的例子测试就可以说明:

01 #include”apue.h”
02 int main(){
03     int fd1,fd2;
04     if((fd1=open(“/home/run/code/apue/test”,O_RDWR))!=0){
05          printf(“open:error”);
06     }
07     else{
08          printf(“open:OK);
09     }
10     dup2(fd1,fd2);//close(fd1);
11     if(write(fd1,“hello”,5)!=0){
12          printf(“error”);
13     }
14     return 0;
15 }

close(fd1)被注释时,hello成功写入test文件,而不注释程序报错,大家可以试一试。

最后,查了一些资料后,基本上搞懂了这个问题。总结如下:

1、如果fildes!=fildes2 ,dup2()先执行 “close(fildes2)”,即先关闭原来fildes2指向的文件(假设有的话),然后再把fildes复制给fildes2,返回fildes2。

2、如果fildes==fildes2,从使用者的角度来看,dup2()不做任何工作,直接返回fildes2。

Tags: . 6,287 views
Home

10 Comments so far

Trackbacks/Pingbacks

Leave a comment

Name(required)
Mail (required),(will not be published)
Website(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
URLs must be fully qualified (eg: http://blog.nlogn.cn),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.