Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 4个文件描述符是否可以指向同一个文件表条目_Unix - Fatal编程技术网

Unix 4个文件描述符是否可以指向同一个文件表条目

Unix 4个文件描述符是否可以指向同一个文件表条目,unix,Unix,在各种程序中观察到以下代码序列: dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); if(fd > 2) close(fd); 我不明白为什么需要if测试。假设fd是3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是个问题吗 我不明白为什么需要if测试。假设fd是3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是个问题吗 假设fd为0、1或2。如果不进行测试,则STDIN、STDOUT或STDERR中的一个将关闭

在各种程序中观察到以下代码序列:

dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);

if(fd > 2)
 close(fd);
我不明白为什么需要if测试。假设fd是3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是个问题吗

我不明白为什么需要if测试。假设fd是3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是个问题吗

假设fd为0、1或2。如果不进行测试,则STDIN、STDOUT或STDERR中的一个将关闭。这段代码试图确保IN/OUT/ERR映射到一个已知的文件——可能是指向/dev/null opened O_RDWR的重定向——这样以后的读/写操作就不会受阻于EBADF,更糟糕的是,不会发送到错误的fd

或者假设完全省略了结束语。如果fd为3或更大,则该文件描述符可能泄漏,由子进程继承,即使在exec之前复制了IN/OUT/ERR,从而授予对我们不希望该子进程拥有的资源的访问权

假设fd是3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是个问题吗

也许吧

由于标准流指向打开的文件,因此泄漏文件描述符可能没有问题,因为底层文件描述可能在进程关闭之前不会关闭。这当然是草率的,但实际上不会引起问题

但这有点乐观。也许程序将调用fork和/或exec,或者它将再次重定向标准流。在本例中,我们不仅泄漏了一个文件描述符,还泄漏了一个完整的打开文件。这是一件坏事