首先打开一个文件,关闭标准流,再使标准流指向文件对应的文件描述符。
static int dupfd(unsigned int fd, unsigned int arg)
{
if (fd >= NR_OPEN || !current->filp[fd])
return -EBADF;
if (arg >= NR_OPEN)
return -EINVAL;
// 返回的文件描述符大于等于arg,即用户传进来的
while (arg < NR_OPEN)
if (current->filp[arg])
arg++;
else
break;
// 没有可用的文件描述符了
if (arg >= NR_OPEN)
return -EMFILE;
// 清除该文件描述符的close_on_exec flag
current->close_on_exec &= ~(1<<arg);
// file结构体引用数加一,因为多了一个文件描述符指向他
(current->filp[arg] = current->filp[fd])->f_count++;
return arg;
}
int sys_dup2(unsigned int oldfd, unsigned int newfd)
{
// 关闭newfd文件描述符,然后返回一个大于等于newfd的文件描述符
sys_close(newfd);
return dupfd(oldfd,newfd);
}