是否可以在C中获取文件描述符(Linux)的文件名?
您可以使用readlink
在/proc/self/fd/NNN
其中NNN是文件描述符。这将为您提供文件打开时的名称-
但是,如果此后文件被移动或删除,它可能不再准确(尽管Linux在某些情况下可以跟踪重命名)。要进行验证,stat
请提供给定的文件名和fstat
fd,并确保st_dev
和st_ino
相同。
当然,并非所有文件描述符都引用文件,对于那些文件描述符,您会看到一些奇怪的文本字符串,例如pipe:[1538488]
。由于所有真实文件名都是绝对路径,因此您可以轻松确定其中的哪个。此外,正如其他人指出的那样,文件可以具有指向它们的多个硬链接-
这只会报告打开文件的那个。如果要查找给定文件的所有名称,则只需遍历整个文件系统。
文件描述符 Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,很神奇吧?于是所有资源都有了统一的接口,开发者可以像写文件那样通过网络传输数据,我们也可以通过/proc/的文件看到进程的资源使用情况。 内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。 应用 我们想想操作
文件描述符接口 函数 int fd_new (void) 分配文件描述符 struct dfs_fd * fd_get (int fd) 获取文件描述结构 void fd_put (struct dfs_fd *fd) 放置文件描述符 int fd_is_open (const char *pathname) 判断文件是否已被打开 int select (
问题内容: 有没有办法在原始文件描述符而不是FILE *上执行ftell()的操作(返回文件中的当前位置)?我认为应该有,因为您可以使用lseek()查找原始文件描述符。 我知道我可以使用fdopen()创建与文件描述符相对应的FILE *,但我宁愿不这样做。 问题答案: 只需使用:
问题内容: 我需要从给定的文件描述符中获取一个文件名,该文件描述符位于我编写的一个小型Linux内核模块中。我尝试了在C中从文件描述符获取文件名中给出的解决方案,但是由于某种原因,它会打印出垃圾值(如解决方案中所述使用on )。我该怎么做? 问题答案: 不要调用-使用与读取其中一个链接时相同的方法。开始与代码中和的。 从广义上讲,给予和从你感兴趣的(你已采取的引用)的任务,你想做的事: 如果您的代
当使用了大量虚拟主机,而且每个主机又使用了不同的日志文件时,Apache可能会遭遇文件描述符(有时也称为文件句柄)耗尽的困境。Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、每个其他日志文件指令一个、再加10-20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬件限制为止(hard-limit)。 尽管
处理文件描述符 尽管很不像,但是在大多操作系统中,标准输入输出流 stdin 和 stdout 虽然叫做「流」,但它们都有文件的接口。我们同样也会将它们实现成为文件。 但是不用担心,作为文件的许多功能,stdin 和 stdout 都不会支持。我们只需要为其实现最简单的读写接口。 进程打开的文件 操作系统需要为进程维护一个进程打开的文件清单。其中,一定存在的是 stdin stdout 和 std