// duplicate file int file_dup(int fd1, int fd2) { int ret; struct file *file1, *file2; if ((ret = fd2file(fd1, &file1)) != 0) { return ret; } if ((ret = fd_array_alloc(fd2, &file2)) != 0) { return ret; } fd_array_dup(file2, file1); return file2->fd; }
// 我们来看一下复制files_struct的函数dup_fs int dup_fs(struct files_struct *to, struct files_struct *from) { // cprintf("[dup_fs]\n"); assert(to != NULL && from != NULL); assert(files_count(to) == 0 && files_count(from) > 0); if ((to->pwd = from->pwd) != NULL) { vop_ref_inc(to->pwd); // 增加引用就可以了 } int i; struct file *to_file = to->fd_array, *from_file = from->fd_array; for (i = 0; i < FILES_STRUCT_NENTRY; i ++, to_file ++, from_file ++) { if (from_file->status == FD_OPENED) { /* alloc_fd first */ to_file->status = FD_INIT; fd_array_dup(to_file, from_file); } } return 0; }