Line 23:
Line 23:
fd = open_a_file(fd->file);
fd = open_a_file(fd->file);
dup2(fd, fd->tgt_fd);
dup2(fd, fd->tgt_fd);
+
close(fd);
+
</pre>
+
+
Now let's remember, that a file can be opened multiple times in one task, this is happens when you e.g. start a shell. One of the <code>/dev/tty</code> or alike files will sit under 0, 1 and 2 descriptors. Not a big deal, we just expand the <code>struct fd</code>
+
+
<pre>
+
struct fd {
+
struct file *file;
+
int n_fds;
+
int *tgt_fds;
+
} *fd;
+
</pre>
+
+
and the code itself:
+
+
<pre>
+
int fd, i;
+
+
fd = open_a_file(fd->file);
+
for (i = 0; i < fd->n_fds; i++)
+
dup2(fd, fd->tgt_fds[i]);
close(fd);
close(fd);
</pre>
</pre>
[[Category:Under the hood]]
[[Category:Under the hood]]