有没有通过 fstat() 的 POSIX 方法来检查文件是否是符号链接?

2024-04-09

有没有 POSIX 方式通过fstat(2)检查文件是否是符号链接?

有旗帜O_NOFOLLOW in open(2)可以检查它,但是,它不是 POSIX。

S_ISLNK in fstat(2),其中说man fstat:

   The S_ISLNK() and S_ISSOCK() macros are not in POSIX.1-1996,
   but both are present in POSIX.1-2001; the former is from SVID
   4, the latter from SUSv2.

并且在我的机器上编译将失败。

另外,还有一个S_IFLNK in lstat(2),但是,它不适用于fstat(2)(将跟随所引用文件的链接)。


No.

这不是真的fstat遵循符号链接。反而,open遵循符号链接。一旦你到达fstat,为时已晚,信息消失了。

Tell us为什么您需要知道,我们可以帮助解决这个问题。 (打开另一个问题。)

文件如何工作:

下面是一些伪 C/shell 代码:

system("echo 'Hello, World!' >A.txt");
system("ln A.txt B.txt");
system("ln -s A.txt C.txt");

fdes = open("C.txt");
unlink("A.txt");
unlink("C.txt");
data = read(fdes);
write(stdout, data);

结果:你的程序打印"Hello, world!"。世界的现状是这样的:



+--Application--+    +--Kernel--+    +-------Disk-------+
|               |    |          |    |                  |
|  fdes --------------> file ---------> inode #973 <-------+
|               |    |          |    |  "Hello World!"  |  |
+---------------+    +----------+    |                  |  |
                                     |  directory ---------+
                                     |  "B.txt"         |
                                     |                  |
                                     +------------------+
  

就内核而言,打开的文件是“inode #973”。内核内存中的数据结构有一些附加信息,例如当前位置,但它不知道路径。内核不应该知道该信息。

如果你问内核路径是什么,它会回答could说“你有 B.txt”打开。但是您从未打开“B.txt”,您打开了“C.txt”,它是“A.txt”的符号链接,并且“A.txt”和“C.txt”都已被删除(它们只是首先)。

简单的比喻:

你接到一个老朋友的电话。他问道:“我是否在电话簿中查找过你的电话号码,是否记住了它,还是我必须向别人询问你的电话号码?”

你没有办法知道答案。您所知道的只是线路另一端的人是谁。就像打开的文件不存储有关其名称的信息(硬链接或符号链接)一样,它只包含有关权限和数据的信息。

解决方案:只需使用lstat(是的,存在竞争条件)。如果您自己没有打开该文件(例如,您从父进程获取它或通过套接字获取它),那么或多或少不可能知道它是否是通过符号链接打开的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有通过 fstat() 的 POSIX 方法来检查文件是否是符号链接? 的相关文章

  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • 为什么 ld 无法从 /etc/ld.so.conf 中的路径找到库?

    我想添加 opt vertica lib64进入系统库路径 所以我执行以下步骤 1 添加 opt vertica lib64 into etc ld so conf 然后运行ldconfig 2 检查 bash ldconfig p gre
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 如何从类似于 eclipse 的命令行创建可运行的 jar 文件

    我知道 eclipse 会生成一个可运行的 jar 文件 其中提取并包含在该 jar 文件中的所有库 jar 文件 从命令提示符手动创建 jar 文件时如何执行类似的操作 我需要将所有 lib jar 解压到类文件夹中吗 目前我正在使用 j
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 如何在我的 AWS EC2 实例上安装特定字体?

    我有一个在 AWS EC2 Amazon Linux Elastic Beanstalk 实例上运行的 Python 应用程序 该实例需要某些特定字体才能生成输出 并且想知道如何在部署或实例启动过程中安装它们 我的代码在本地计算机 OS X
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • 如何在 Windows 上向 git 存储库添加符号链接?

    我使用 GitHub 的电子环境编译 OS X 的二进制文件 并希望将输出添加到 git 存储库 我试过 git add error readlink sulu app Contents Frameworks Electron Framew
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 将 read.csv 与符号链接文件一起使用

    我正在尝试做什么 我的源文件非常大 我想避免将其复制到其他文件夹中 我决定创建一个指向大文件的符号链接并想使用read csv读取文件 文件夹结构 项目1 数据 源文件 csv 项目2 数据 别名到源文件 csv 什么地方出了错 读取源文件

随机推荐

  • 想要在 OSX 上的 OpenCV 中实时镜像视频,不知道从哪里开始

    如果还不是很明显的话 这是我第一天使用 OpenCV 我希望做的是镜像frame2 然后对其进行上采样 我不确定如何在这些 IplImage 类型的帧上使用矩阵运算 我如何镜像我的frame2 然后将其上采样到Webcam2 窗口 下面是我
  • 连接 SAP HANA 数据库时调用未定义函数 odbc_connect() 消息

    I used odbc connect 在我的 PHP 页面中连接到 HANA 数据库 当我在本地运行它时效果很好 我将相同的 PHP 页面上传到服务器中 但收到此错误 致命错误 调用未定义的函数 odbc connect 代码 conne
  • 有人可以解释一下 Google Chrome 内存缓存吗?

    根据this https developer chrome com extensions webRequest CachingAPI 文档 这是我找到的唯一描述内存缓存的来源 Chrome 使用两种缓存 磁盘缓存和非常快的内存中缓存 缓存
  • Android新构建系统(gradle)和aspectj

    在 Google IO 中 宣布新的构建系统 gradle 将会取代 ant 我的项目正在使用aspectj 我想在我的项目中使用它 我无法找出一些变量来让它工作 我在那里找不到 android 输出类路径 有人可以帮忙吗 这是我当前的 b
  • Tipsy live 不适用于 jQuery 1.9.0

    我们最近将 jQuery 升级到了 1 9 0 但它破坏了我们的醉酒插件 它是live功能现在会导致错误 tooltip abbr tipsy live true TypeError this binder is not a functio
  • 如何修复 css({ float: 'left' }) [重复] 上的闭包编译器错误

    这个问题在这里已经有答案了 可能的重复 Google Closure 编译器解析错误 属性 ID 无效css float left https stackoverflow com questions 6611867 google closu
  • Android MotionEvent.ACTION_MASK

    在 OnTouchEvent 中 如果您使用以下命令切换不同的触摸操作 switch e getAction 它处理 ACTION DOWN 和 ACTION MOVE 但由于某种原因它不会捕获 ACTION POINTER DOWN 而如
  • 使用 T-Sql,如何将远程服务器上的一个表插入到本地服务器上的另一个表中?

    给定远程服务器 生产 当前可通过 IP 访问 和本地数据库 开发 我如何运行INSERT使用 T SQL 从 生产 进入 开发 我使用的是 MS SQL 2005 两个数据库之间的表结构有很大不同 因此我需要手动编写一些迁移脚本 UPDAT
  • 从 Excel 中选定的选项卡中选取数据

    我有以下问题 我有一个包含许多选项卡的文件 每个选项卡的名称是一个国家 地区 选项卡中包含有关该国家 地区的各种数据 我想创建一个界面选项卡 用户可以在其中将国家 地区名称放入单元格中 例如 法国 单元格 A1 将数据项放入另一个单元格中
  • Hbase 列族

    Hbase 文档表示 避免创建超过 2 3 个列族 因为 Hbase 不能很好地处理超过 2 3 个列族 其原因在于压缩和刷新 以及 IO 但是 如果我的所有列总是填充 对于每一行 那么我认为这个推理并不那么重要 因此 考虑到我对列的访问是
  • C# 命名空间是否编译为 IL 文件作为“完整”名称?

    例如 如果我有 namespace a namespace b class C class D 那么编译完成后 IL文件中的命名空间信息在哪里呢 我是否会得到两个名为 a b C 和 a b D 的类 其中类名以命名空间名称为前缀 或者我在
  • 在Delphi中销毁COM对象

    有一些 net程序集 通过COM在delphi中调用它 var intf ITest intf CreateComObject CLASS TEST as ITest here comes some stuff 我必须做点什么来破坏它以释放
  • COM 互操作、隔离和排除重复引用

    我们在我们编写的 C dll 程序集 A 中使用 Microsoft 提供的 COM DLL dsofile dll 为了避免必须注册 COM dll 我已将对 dsofile dll 的引用的isolated 属性切换为 true 这意味
  • 使用 CSS3 在文本上创建双色锐渐变

    我需要为我正在构建的网站上的标题和导航文本创建 锐利 渐变 我正在尝试使其尽可能纯 HTML5 CSS3 并且愿意坚持使用 font face而不是转移到Cufon 我所说的锐渐变是指两种颜色 两者之间没有混合 例子 http dl dro
  • Apache NIFI Jon 不会自动终止

    我是 Apache NIFI 工具的新手 我正在尝试从 mongo db 导入数据并将该数据放入 HDFS 中 我创建了 2 个处理器 第一个用于 MongoDB 第二个用于 HDFS 并且我正确配置了它们 该作业正在成功运行并将数据存储到
  • 由于错误而导致代码崩溃:无法从空集合中删除最后一个元素

    我正在尝试绘制一些数据图表 以下代码最初可以工作 并且有时可以工作 但现在似乎大部分崩溃 我认为 json 函数中的 if let data data 行意味着它只会运行一旦它收到数据 我有一种感觉 也许该函数在完全加载之前正在解包数据 但
  • 基于 STOMP 身份验证的 Spring 4 WebSocket

    我正在开发一个基于 Spring 4 WebSocket 的多人游戏 我的服务器是无状态的 因此为了识别玩家 我使用令牌 经过一段时间的努力 如何通过 WebSockets 识别玩家 我想出了这个解决方案 在客户端玩家寄存器上 如下所示 v
  • 如何计算 CRC 中使用的 XOR 余数?

    我试图记住如何计算循环冗余检查中的 XOR 算法的剩余部分以验证网络消息的剩余位 我不应该扔掉那本教科书 这在代码中很容易完成 但是如何手动计算出来呢 我知道它看起来像标准除法算法 但我不记得从那里去哪里获得余数 1010 10110100
  • RubyMine 对 jQuery 的支持

    我正在使用 RubyMine 3 1 开发 Rails3 应用程序 今天我从 Prototype 切换到 jQuery 以满足我的 UJS 需求 使用自定义一切后这个例子 http www stjhimy com posts 7 creat
  • 有没有通过 fstat() 的 POSIX 方法来检查文件是否是符号链接?

    有没有 POSIX 方式通过fstat 2 检查文件是否是符号链接 有旗帜O NOFOLLOW in open 2 可以检查它 但是 它不是 POSIX 有S ISLNK in fstat 2 其中说man fstat The S ISLN