【问题标题】:Returning values from linux binary从 linux 二进制文件返回值
【发布时间】:2020-05-26 19:39:19
【问题描述】:

首先,让我说我对编写驱动程序非常陌生,所以如果我的术语完全不正确,我深表歉意。

我正在尝试编写一个驱动程序来控制 LED 并读回我的 FPGA 开发板上的一些寄存器。 正如here 指出的那样,我知道我可以通过使用(在我的 C 程序中)提供我的二进制(或 C 程序)输入值:

int main(int argc, char *argv[]) { /* ... */ }

因此,例如,如果我在我的 Linux shell 中运行:

root@socfpga:~# ./LED_BLINK 182

我可以将输入整数 182 发送到在 linux shell 脚本中执行的二进制文件。就我而言,这会使我的 LED 闪烁 182 次(这部分有效)。所以我知道如何给程序输入,但是如何正确地从程序中提取输出呢?

我的主要问题如下:

1) 一般来说,假设我的二进制文件有我想作为输出返回的变量,我该怎么做?例如,如果我想让我的程序输出寄存器 5 的值,我在 shell 中输入:

root@socfpga:~# ./LED_BLINK 1 5

LED 会闪烁一次,然后我的 shell 将返回寄存器 5 的值(这个寄存器只是二进制程序中的一个变量)。

另一种描述我追求的方式,假设如果我有一个寄存器(假设它是一个 16 位值)并且我希望我的程序输出该值,我该如何正确地实现这一点?我可以将变量传递给我的二进制文件(例如指针吗?)并让我的程序写入该值?您能否提供一个示例或教程链接?

2) 与上面类似,如果我有一个寄存器列表(比如 20 个或更多 16 位值),我的二进制文件如何正确输出这些值(可能是指针数组)?

3) 我确信这个过程有一个技术名称。这个“技术上”叫什么(这样我就可以拥有更智能的谷歌搜索条目)?

感谢您的帮助, 詹姆斯

【问题讨论】:

  • 一般来说,Unix 从程序返回数据的方式是简单地打印到stdout
  • 您好,感谢您的回复。哦,哇,所以我可能真的想多了,哈哈。
  • 打印到 stdout 或 stderr 是一种选择,但如果您正在编写 C 代码,则可以返回一个值。这就是为什么main() 是类型int 而不是void。只需用return(value) 结束您的主程序,您就可以返回一个值。通常命令行通常会将此视为退出状态,但您可以随意对待它。您可以在 bash 中使用 echo $? 访问它。
  • “我可以将输入整数 182 发送到我的二进制文件中……” -- 这不是 “整数”。程序的参数作为字符串传递(在这种情况下是由数字组成的字符串)。顺便说一句,您过度使用和滥用术语 “二进制”;如果您指的是您的程序(或其编译/可执行版本),请写“我的程序”而不是使用模棱两可的实体。

标签: linux c embedded


【解决方案1】:

在 Unix 设置中的程序之间传递数据的最直接方法是使用标准输入和输出“管道”(也称为 stdinstdout)。

默认情况下,C 语句“printf”将默认写入标准输出,默认情况下您将在终端上看到输出,或者您可以将其传递给另一个程序使用“|”作为输入,或使用“>”操作数作为另一个文件类型操作。

这在这篇文章中有更详细的解释:What does it mean to write to stdout in C?

【讨论】:

  • 感谢您的回复。看来我在原来的帖子里想多了。
  • 我在大型机上开始了我的编码生涯。当我转向 UNIX 及其变体时,我花了一段时间才明白“把所有东西都当作文件对待”是系统核心的一种生活方式。你在正确的道路上!
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 2013-05-05
  • 2012-03-21
  • 1970-01-01
  • 2013-02-23
相关资源
最近更新 更多