在我的代码中,我扫描输入文件,然后将其作为函数的参数传递。是否有一个函数可以用来获取文件的路径名?唯一允许的输入是文件名。
最佳答案
不,一个文件可以有多个名称,并且系统不会维护(文件打开后)用于打开它的路径。在这种情况下,唯一确定用于打开文件的名称是不明确的,因此没有做出任何规定。
事实上,两个文件都无法知道它属于哪个目录,因为多个目录可以有到该文件的链接,因此文件的路径可以是多个,因此,尝试解码哪个是所使用的路径打开它是不可行的。
假设您有一个正在使用当前工作目录 /etc
执行的进程。您可以使用多个不同的路径打开文件/etc/passwd
,例如,其中任何一个都将打开示例进程的文件:
open("/etc/passwd", ...);
open("passwd", ...);
open("./passwd", ...);
open("default/../passwd", ...);
open("/../../../etc/passwd", ...);
等等...
如果您不仅需要文件的文件描述符,还需要用于打开的名称,只需将两者传递给函数即可。
对其他帖子的评论的注意事项
如果进程从其父进程继承当前工作目录,则无法知道父进程如何到达该目录(使用的路径),因此对文件绝对路径的引用将永远丢失。由于存在符号链接(symbolic link),因此确定目录路径也存在歧义。
使用相对路径打开的文件是相对于当前目录的,这是一个进程属性,仅由内核维护作为对 inode 的引用,因此用于获取此类目录的路径对于进程来说是未知的。确实,目录的路径是已知的,因为每个目录都有一个指向其父目录的 ..
条目,依此类推,指向根目录,其 ..
指向自身。
以这种方式确定目录的路径是一项昂贵的操作,需要访问父目录并在该目录中搜索 inode 编号与实际目录 inode 编号相同的条目,依此类推,直到我们开始重复 inode 号(对于根目录)
由于当前目录是从进程父进程继承的,因此在文件打开后它可能已更改,因此,您可能会丢失与现有路径的任何关系(用于打开文件的路径,可能在父进程)以及开始执行时继承的当前目录。
关于c - 如何将文件名的输入作为函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205379/