Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798120
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-28 12:58:11

一个存在的文件描述符可以由以下函数的其中一个复制:


#includde
int dup(int filedes);
int dup2(int filedes, int filedes2);
两者成功都返回新的文件描述符,错误返回-1。


由dup返回的新的文件描述符被保证为可用文件描述符里的最小数字。在dup2,我们用filedes2参数指定新的描述符的值。如果filedes2已 经被打开,它会首先被关掉。如果filedes与filedes2相等,那么dup2返回filedes2,但不关闭它。


函数返回的新的文件描述符与filedes参数共享同一个文件表项。


我们假设一个进程启动时,执行了newfd = dup(1); 并假设下一个可用的文件描述符为3(因为0、1、2都被shell打开,所以很有可能)。因为两个描述符指向同一个文件表项,它们共享同一个文件状态标志 --read、write、append等等--还有相同的当前文件偏移量。


每个描述符有自己的文件描述符标志。正如我们将在下节描述的那样,为新描述符为设的close-on-exec文件描述符标志总是被dup函数清除掉。


另一个复制描述符的方法是使用fcntl函数,我们会在3.14节讨论。事实上,函数调用dup(filedes);与fcntl(filedes, F_DUPFD, 0);等价。类似地,函数调用dup2(filedes, filedes2);与close(filedes2); fcntl(filedes, F_DUPFD, filedes2);等价。


在最后一种情况,dup2并不与close之后的fcntl完全相同。区别在于:


1、dup2是一个原子操作,而另一个调用了两个函数。后者可能会出现在close和fcntl操作之间,有一个信号捕获(signal catcher)被调用的情况。我们在第10章讨论信号。


2、dup2和fcntl有些不同的errno。dup2系统调用起源于第7版本并传播至所有的BSD版本。复制文件描述符的fcntl方法从 System III开始出现,并在System V里延续。SVR3.2挑捡了dup2函数,而4.2BSD选择了fcntl函数和F_DUPFD功能。POSIX.1同时要求dup2和fcntl的 F_DUPFD功能。
阅读(943) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~