调用open时如何调用sys_open而不是sys_openat

2023-12-09

我编写了一段代码来生成系统调用

void open_test(int fd, const char *filepath) {
    if (fd == -1) {
        printf("Open \"%s\" Failed!\n", filepath);
    } else {
        printf("Successfully Open \"%s\"!\n", filepath);
        write(fd, "successfully open!", sizeof("successfully open!") - 1);
        close(fd);
    }
    fflush(stdout);
}

int main(int argc, char const *argv[]) {
    const char fp1[] = "whatever.txt", fp2[] = "./not-exist.txt";
    int fd1 = open(fp1, O_CREAT | O_WRONLY | O_TRUNC, S_IRWXU);
    int fd2 = open(fp2, O_WRONLY | O_TRUNC, S_IRWXU);
    open_test(fd1, fp1);
    open_test(fd2, fp2);
    return 0;
}

和另一个程序(详细信息省略)来捕获系统调用,但后来我发现了所有open()结果调用的是 sys_openat 而不是 sys_open。

以下文本是程序的输出:

Detect system call open, %rax is 257, Addr is 0x00007fefef78aec8, Pathname is /etc/ld.so.cache
Detect system call open, %rax is 257, Addr is 0x00007fefef78aec8, Pathname is /etc/ld.so.cache
Detect system call open, %rax is 257, Addr is 0x00007fefef993dd0, Pathname is /lib/x86_64-linux-gnu/libc.so.6
Detect system call open, %rax is 257, Addr is 0x00007fefef993dd0, Pathname is /lib/x86_64-linux-gnu/libc.so.6
Detect system call open, %rax is 257, Addr is 0x00007fffd44e38e3, Pathname is whatever.txt
Detect system call open, %rax is 257, Addr is 0x00007fffd44e38e3, Pathname is whatever.txt
Detect system call open, %rax is 257, Addr is 0x00007fffd44e38f0, Pathname is ./not-exist.txt
Detect system call open, %rax is 257, Addr is 0x00007fffd44e38f0, Pathname is ./not-exist.txt
Successfully Open "whatever.txt"!
Open "./not-exist.txt" Failed!

这里 rax=257 表示调用了 sys_openat(对于 sys_open,rax=2)


您可以通过以下方式致电syscall(2)包装:syscall(SYS_open, ...):

#define _GNU_SOURCE
#include <unistd.h>
#include <fcntl.h>
#include <err.h>
#include <sys/syscall.h>

int main(void){
        char *path = "whatever.txt";
        int fd = syscall(SYS_open, path, O_RDONLY, 0);
        if(fd == -1) err(1, "SYS_open %s", path);
}

但为什么要麻烦呢?SYS_openat现在是规范的系统调用,open(2)只是一个 API,并且SYS_open保留系统调用条目只是为了向后二进制兼容性。

在较新的架构上,可能没有实际的SYS_open根本没有系统调用。

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

调用open时如何调用sys_open而不是sys_openat 的相关文章

  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • jQuery - 将鼠标悬停在父 div 上时播放视频

    我正在创建一个视频库 其中包含悬停时播放短视频的缩略图 我已经能够让它们在将鼠标悬停在视频本身上时播放 但我需要它们在将鼠标悬停在视频的父 div 上时播放 到目前为止 这是我的尝试 HTML div class thumbail div
  • Android:如何与另一个 Activity 进行垂直 Activity 过渡

    我的第一个 Activity 中有一个 ListView 当我点击里面的一个项目时 我启动另一个活动 好吧 但现在我想修改这两个活动之间的转换 Activity1 gt Activity2 Activity2 从下到上的垂直过渡 渐进 当我
  • 为什么调用react setState方法不会立即改变状态?

    我正在阅读Forms的部分reactjs文档并尝试使用此代码来演示onChange usage JSBIN var React require react var ControlledForm React createClass getIn
  • 脚本未在 templateurl 中运行

    这是我的角度 js 文件 测试 js 文件 var app angular module angleapp controller MainController scope function scope scope test hi all d
  • 如何使用占位符获取用户输入?

    我目前正在用 Rust 编写一个简单的记事本应用程序 在主循环期间 要求用户插入 删除或更改行 当用户更改行时 我想预先填充该行的内容 以便用户可以更轻松地编辑行 像这样 下划线代表终端光标 用户选择该行后尚未进行任何输入 Content
  • 将插件保留在项目中和配置文件中之间的区别

    谁能解释一下下面的功能吗 A 实际上下面的代码对我有用 但我不明白为什么我们需要使用下面的Maven 战争插件
  • Android 中是否可以共享音频输入(麦克风)流?

    我正在编写一个作为后台服务运行的应用程序 记录和分析从麦克风录制的音频 当我的应用程序运行时 我无法使用其他使用麦克风的应用程序 例如电话 录音等 我的问题是 有没有办法在 Android 中共享麦克风流 也许通过使用 NDK 如果没有 是
  • 穷人的 C#“词法分析器”

    我正在尝试用 C 编写一个非常简单的解析器 我需要一个词法分析器 它可以让我将正则表达式与标记关联起来 这样它就可以读取正则表达式并返回符号 看来我应该能够使用正则表达式来完成实际的繁重工作 但我看不到一种简单的方法来做到这一点 一方面 正
  • 为什么 Twitter Bootstrap 需要多个按钮类?

    使用以下命令制作主按钮Twitter 的 Bootstrap 库 您需要使用两个 CSS 类 如下所示 class btn btn primary 当他们可以让 btn primary 包含 btn 包含的所有 CSS 时 为什么他们要这样
  • 如何使用rails服务器在Angular中获取索引数据

    我从 Angularjs Rails 后端开始 尝试从服务器获取用户数据 相当于controller index轨道上的动作 我已经遵循了几个教程 发现这段代码是最清晰的 问题1 如何正确地将角度模块链接到视图中 2 如何使用本文中的 ty
  • ASP.NET Core:从 GET 重定向到 POST

    我想打电话MarriageById作为 GET 像这样 var url MarriageById id id 但我也想拥有一个ActionResult Marriage Marriage marriage 在显示视图之前会进行一些处理 这第
  • 为什么使用 Prism EventAggregator 时未调用我的 Subscribe 方法?

    我正在学习棱镜 几个小时后我就遇到了一个问题 订阅事件时 订阅方法没有被调用 我在用Prism and Autofac 在下面的简化示例中 主视图模型 Publish dupa 事件被称为ctor 然后单击按钮更新窗口被打开 在窗口的后端创
  • 在 VBA 中编程多个 .FindNext

    我对VBA相对缺乏经验 但通常可以完成简单的任务 我目前在使用 Find 函数时遇到问题 我知道 excel 没有能力执行两次 finds 但我在为第二次查找编写循环时遇到问题 到目前为止我的代码在这里 Dim j As Integer D
  • eclipse 没有为其中开发的任何应用程序生成 apk 文件吗?

    我一直在使用 eclipse IDE 在 android 中开发一些应用程序 所有这些应用程序在模拟器上运行良好 但 eclipse 没有生成它们的 apk 文件 并且我无法在任何设备中安装应用程序 此外 在模拟器上运行应用程序时 它不会给
  • 阻止外部访问 PHP 脚本但允许 AJAX

    我读了很多关于 htaccess 规则 检查标头 使用加密等的内容 但我还没有找到我想要的答案 我知道 假设服务器设置正确 您将无法使用 AJAX 访问我珍贵的 PHP 脚本 我尝试检查是否定义了一个访问变量 该变量不允许地址栏访问 但也阻
  • 在express.js上启用HTTPS

    我正在尝试让 HTTPS 在 Express js 上为 Node 工作 但我无法弄清楚 这是我的app js code var express require express var fs require fs var privateKe
  • Android KSOAP2 抛出 SocketTimeoutException

    我在我的 Android 项目中使用了上述 SOAP 对象库 以便连接到 NET Web 服务 该应用程序运行良好 直到我做了一些更改并增加 减少了目标 API 它开始抛出 SocketTimeoutException 并且不会消失 我在用
  • 选择firstChild和空格问题

    我有一个这样的标记 table thead tr td Hello td tr thead table 但是当我尝试选择第一个孩子时 table 它返回空格 正如预期的那样 var ss document getElementById my
  • 样式下拉(选择)框

    我知道使用 jquery 可以制作一些看起来像选择框的东西 这样我就可以让它看起来像我想要的那样 然而 如果只有 css 我有多少控制权 我使用了边框 内边距和宽度 最终结果看起来很棒 唯一让我烦恼的是掉落的部分 这有什么控制吗 有填充看起
  • 调用open时如何调用sys_open而不是sys_openat

    我编写了一段代码来生成系统调用 void open test int fd const char filepath if fd 1 printf Open s Failed n filepath else printf Successful