【问题标题】:Daemon on embedded Linux device using Busybox be written in C or as a script使用 Busybox 的嵌入式 Linux 设备上的守护程序用 C 或脚本编写
【发布时间】:2015-04-29 20:34:28
【问题描述】:

嵌入式设备上使用 Busybox 的守护程序应该用 C 语言还是脚本编写?

我看到的所有示例都在文件顶部使用#! /bin/ash,那是为了编写脚本?但在我正在写入的设备中,/usr/bin 中只有编译的 C 文件(我认为)和符号链接。

我尝试使用#include </bin/ash>(例如gcc -Wall -o daemon_busybox daemon_busybox.c)编译C 文件的每一种方式都在/bin/ash 中报告错误后出现错误:

/bin/ash:174:1: 错误:程序中出现杂散“\213”
/bin/ash:174:1:错误:程序中出现杂散“\10”
/bin/ash:174:1: 错误:程序中出现杂散“\273”
/bin/ash:174:1: 错误:程序中出现杂散“\204”
/bin/ash:174:1: 错误:程序中出现了“\342”

注意我已经设置了这个:/bin/ash -> busybox

有什么想法我应该走哪条路吗?

更新:

我的任务是查看是否可以在运行 Linux (2.6.35-at-alpha4) 和 Java (SE Embedded Runtime Environment) 且内存非常有限的小型设备上运行守护程序(即等待 10 秒以获取 java -version 报告)。

两周前,我对守护进程了解不多——只知道这个词。所以,这对我来说都是新的。

在我的开发机器上,我构建了两个不同的守护程序文件,一个在 C 中,一个作为脚本。两者都在我的 Linux 机器上运行得非常好。

但是由于目标设备的尺寸非常小,所以只有busybox(没有/lib/lsb/init-functions)。所以我正在尝试构建第三个守护程序文件。我认为应该为这个设备用 C 语言编写它,但是busybox 的所有示例都指向脚本。

【问题讨论】:

  • 听起来你正试图像运行一个shell脚本一样运行一个编译过的程序。
  • 你意识到 C 程序是用例如编译的。首先是 GCC,对吗?此外,Java 与这些有什么关系?我不确定现在谁更困惑;你或我。
  • Jonathon Reinhart - 感谢您仔细阅读我的帖子 (^.^)v
  • 这个守护进程到底是做什么的?
  • 现在只是一个测试,看看我们是否可以在我们的设备上运行一个守护进程。

标签: c embedded daemon busybox


【解决方案1】:

一旦您的问题被编辑,以便您尝试 #include 的文件名可见,问题就变得不言而喻:

#include </bin/ash>

这试图使 C 编译器将busybox 的二进制文件(通过符号链接/bin/ash)包含到要编译的代码中。平均二进制不是有效的 C 源文件;这注定要失败。

也许您只需要删除该行 - 如果 C 编译器有头文件和源文件进行编译,它就有更好的工作机会。也许还需要做更多的工作;我们没有足够的信息来提供帮助。

许多守护程序是用 C 程序编写的,但可以使用精心编写的 shell 脚本代替。


就个人而言,我想将其作为脚本来执行(我从不喜欢 C)。但在设备上,/usr/sbin 文件夹中的所有内容看起来都像 C 文件。所以,我的保守编码员说 C 是要走的路。我知道:问问那些开发设备的人——但他们早就走了。现在我的守护进程只是一个测试(即printf("Hello World\n");)。我正在尝试将 printf 传递给 Busybox。但到目前为止我无法编译这个文件。我只需要一个简单的 C 守护进程即可启动。

好的;你的 C 代码应该是:

#include <stdio.h>
int main(void)
{
    printf("Hello World\n");
    return 0;
}

将其保存在hw_daemon.c。编译使用:

gcc -o hw_daemon hw_daemon.c

如果这不能编译,那么你就没有一个可用于目标机器的 C 开发环境。如果可以编译,您应该能够运行它:

./hw_daemon

您应该会看到臭名昭著的“Hello World”消息出现。

如果这不起作用,那么您可以在文件hw_script.sh 中使用脚本版本:

#!/bin/ash
printf "Hello World\n"

你应该能够运行它:

预测的输出——不是在机器上观察到的输出。

$ ash hw_script.sh
Hello World
$ chmod +x hw_script.sh
$ ./hw_script.sh
Hello World
$

如果这些都不起作用,那么您的系统就会出现重大问题(例如,也许 Busybox 没有提供类似的 printf 命令,并且您需要使用 echo "Hello World" 而不是 @ 987654337@).

【讨论】:

  • 感谢您的回复。删除#include 不是问题,只要有另一种方法可以将调用传递给busybox。 PATH 会起作用吗?
  • #! /bin/ash 给了我无效的预处理指令 #!
  • 您的daemon_busybox.c 文件中有什么内容?那是C代码还是shell脚本?如果它是 C 代码,则将其编译为 C 程序。如果它是一个 shell 脚本,则不需要编译(但您可能确实需要一个 shebang 作为第一行)。如果您需要运行 Busybox 程序,名义上您可以使用system() 或者popen() 和pclose() — 这在需要运行其他程序的 C 程序中并不少见。但是真的不清楚你在daemon_busybox.c中有什么,这让你很难猜测你需要做什么。
  • 总的来说,如果可以的话,你应该创建一个脚本,而不是一个 C 程序。我没有积极使用过 Busybox,所以我不能轻易地告诉你创建一个在 Busybox 环境中运行的 C 程序所涉及的内容。
  • 就个人而言,我想将其作为脚本来执行(我从不喜欢 C)。但在设备上,/usr/sbin 文件夹中的所有内容看起来都像 C 文件。所以,我的保守编码员说 C 是要走的路。我知道——问问那些开发设备的人——他们早就走了。现在我的守护进程只是一个测试(即 printf("Hello World\n"); )。我正在尝试将 printf 传递给 Busybox。但到目前为止我无法编译这个文件。我只需要一个简单的 C 守护程序即可启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2014-08-13
  • 2023-03-26
相关资源
最近更新 更多