【问题标题】:Taking input without using libc在不使用 libc 的情况下获取输入
【发布时间】:2013-01-24 11:57:33
【问题描述】:

如何在不使用 libc 的情况下获取输入或打印输出?我可以使用系统调用,但不知道这是否有帮助。

【问题讨论】:

  • libc 提供了一个可移植的抽象来执行此操作...您当然可以在没有 libc 的情况下进行 I/O,但您需要告诉我们这是什么系统才能获得任何有意义的答案。
  • 我用的是x64系统
  • 鉴于提到libc,这似乎是一个 Unix 或 Linux 问题。但是,是的,确定目标平台会很好。
  • ...你为什么要这样做?

标签: c


【解决方案1】:

没有独立于平台的方法来做到这一点。事实上,拥有libc 的全部意义在于为大多数系统提供的一组功能提供一个通用接口,但以根本不同的方式实现。

您最好的选择可能是查阅您当前使用的任何系统的文档。您可以查找操作系统的中断集,然后尝试使用asm 关键字编写汇编指令,告诉操作系统读取输入或显示输出。您可以查看操作系统提供的用于对文件描述符进行输入和输出的库,然后改用这些函数。或者,您可以查看进程创建库,然后生成一个进程以从控制台读取或写入数据,其中第二个程序使用libc。但是,这些都不能保证是可移植的。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我使用 gdb 浏览了write(2),以了解系统调用 ABI 的工作原理。

    无论如何,根本没有 libc。请注意,如果没有特殊技巧,cc(1) 编译器/链接器前端仍会将您与 libc 链接,但您不会将它用于任何事情。 C 运行时启动代码会进行一些 libc 调用,但此程序不会。

    void mywrite(int fd, const void *b, int c) {
      asm("movl $1, %eax");
      asm("syscall");
    }
    
    int main(void) { const char *s = "Hello world.\n"; return mywrite(1, s, 13), 0; }
    

    【讨论】:

    • 不,我的意思是不使用 LIBC,用于 linux x64
    • 啊哈,那么您可以使用 asm() 语句或键入您自己的 write.s 包装器来围绕 x86_64 ABI 用于捕获内核的任何指令。
    • 我将如何使用 asm 语句,我必须实现或调用哪些系统调用?用于输入和显示输出?
    • how would I use asm statements - 如果你不得不问,你不应该使用 asm 语句。
    • @DigitalRoss,这不只是为了打印吗?我将如何接受输入,因为我不能使用 scanf,我将如何让用户通过控制台传递输入,然后我进行解析;不使用 scanf..
    猜你喜欢
    • 2021-05-04
    • 2011-02-10
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多