c - 如何将文件名的输入作为函数的参数?

标签 c

在我的代码中,我扫描输入文件,然后将其作为函数的参数传递。是否有一个函数可以用来获取文件的路径名?唯一允许的输入是文件名。

最佳答案

不,一个文件可以有多个名称,并且系统不会维护(文件打开后)用于打开它的路径。在这种情况下,唯一确定用于打开文件的名称是不明确的,因此没有做出任何规定。

事实上,两个文件都无法知道它属于哪个目录,因为多个目录可以有到该文件的链接,因此文件的路径可以是多个,因此,尝试解码哪个是所使用的路径打开它是不可行的。

假设您有一个正在使用当前工作目录 /etc 执行的进程。您可以使用多个不同的路径打开文件/etc/passwd,例如,其中任何一个都将打开示例进程的文件:

  1. open("/etc/passwd", ...);
  2. open("passwd", ...);
  3. open("./passwd", ...);
  4. open("default/../passwd", ...);
  5. open("/../../../etc/passwd", ...);

等等...

如果您不仅需要文件的文件描述符,还需要用于打开的名称,只需将两者传递给函数即可。

对其他帖子的评论的注意事项

如果进程从其父进程继承当前工作目录,则无法知道父进程如何到达该目录(使用的路径),因此对文件绝对路径的引用将永远丢失。由于存在符号链接(symbolic link),因此确定目录路径也存在歧义。

使用相对路径打开的文件是相对于当前目录的,这是一个进程属性,仅由内核维护作为对 inode 的引用,因此用于获取此类目录的路径对于进程来说是未知的。确实,目录的路径是已知的,因为每个目录都有一个指向其父目录的 .. 条目,依此类推,指向根目录,其 .. 指向自身。

以这种方式确定目录的路径是一项昂贵的操作,需要访问父目录并在该目录中搜索 inode 编号与实际目录 inode 编号相同的条目,依此类推,直到我们开始重复 inode 号(对于根目录)

由于当前目录是从进程父进程继承的,因此在文件打开后它可能已更改,因此,您可能会丢失与现有路径的任何关系(用于打开文件的路径,可能在父进程)以及开始执行时继承的当前目录。

关于c - 如何将文件名的输入作为函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205379/

相关文章:

c - 错误 : incompatible types when assigning to type ‘char[25]’ from type ‘char *’

c - 由于 void 指针和整数转换错误,pthread_create 无法工作

c - 为什么 OpenMP 可以加速单次迭代循环?

c - 函数指针,如何转换?

c - [] c 中的指针操作

c - 为什么 fgets 卡在回车\r 上?

c - 来自类 C 引用的并行 Verilog CRC 算法

c - 从文本文件读取时忽略@

c - 多线程初始化中的Unknown Segmentation Fault (Core Dumped)

c - 如何在C中的struct中添加元素