使用 BusyBox 的嵌入式设备上的守护进程应该用 C 编写还是作为脚本编写?
我看到的所有示例都在文件顶部使用
#! /bin/ash
,这是为了编写脚本?但是在我正在写的设备中只有编译的 C 文件(我认为)和 /usr/bin
. 中的符号链接
我尝试用
#include </bin/ash>
编译C文件的每一种方式(例如gcc -Wall -o daemon_busybox daemon_busybox.c
)我在/bin/ash
中的错误报告后得到错误:
/bin/ash:174:1: 错误:程序中有杂散的‘�’ /bin/ash:174:1: 错误:程序中有杂散的‘’ /bin/ash:174:1: 错误:程序中出现杂散的“�” /bin/ash:174:1: 错误:程序中出现杂散的“�” /bin/ash:174:1: 错误:程序中有杂散的‘�’
注意我已经设置了这个:
/bin/ash -> busybox
有什么想法我应该走哪条路吗?
更新:
我的任务是尝试查看守护进程是否可以在运行 Linux (2.6.35-at-alpha4) 和 Java(SE 嵌入式运行时环境)且内存非常有限(即 10 秒等待得到
java -version
报告)。
两周前我对守护进程知之甚少——只知道这个词。所以,这对我来说都是新的。
在我的开发机器上,我构建了两个不同的守护进程文件,一个是 C 语言,一个是脚本。两者都在我的 Linux 机器上运行得很好。
但是由于目标设备的尺寸非常小,所以只有BusyBox(没有
/lib/lsb/init-functions
)。所以我正在尝试构建第三个守护进程文件。我相信它应该为这个设备用 C 编写,但 BusyBox 的所有示例都指向脚本。
一旦您的问题被编辑以便您尝试
#include
的文件名可见,问题就变得不言而喻了:
#include </bin/ash>
这试图让 C 编译器将
busybox
的二进制文件(通过符号链接 /bin/ash
)包含到要编译的代码中。普通的二进制文件不是有效的 C 源文件;这是注定要失败的。
也许您只需要删除该行——如果给 C 编译器提供头文件和源文件进行编译,它就有更好的工作机会。也许还需要做更多的工作;我们没有足够的信息来帮助那里。
许多守护进程是用 C 程序编写的,但可以使用精心编写的 shell 脚本代替。
就我个人而言,我想把它作为一个脚本来做(我从来不喜欢 C)。但在设备上,
文件夹中的所有内容看起来都像 C 文件。所以,我这个保守的编码员说 C 是要走的路。我知道:问问开发设备的人——但他们早就不在了。现在我的守护进程只是一个测试(即/usr/sbin
)。我正在尝试将printf("Hello World\n");
传递给 Busybox。但到目前为止我无法编译这个文件。我只需要一个简单的 C 守护进程即可启动。printf
好的;你的 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"
而不是 printf
).