背景:
我在嵌入式设备上使用 Debian Lenny
uname -a
Linux device 3.4.0 #83 Sun May 26 17:07:14 CEST 2013 armv4l GNU/Linux
我有一个 C 代码(比如说my_C_program
),它调用一个板特定的二进制文件(通过system("spictl someparameters")
)调用spictl
以使用 SPI 接口
user:~# ls -al /usr/local/bin/spictl
lrwxrwxrwx 1 root staff 24 Jun 9 2011 spiflashctl -> /initrd/sbin/spiflashctl
如果我my_C_program
从命令行运行我的代码 ( )
user:~# /user/sbin/my_C_program
执行spictl
没有问题,并从 SPI 接口输出数据。
问题:
我需要在电路板通电时运行该程序。因此,我在at/user/sbin/my_C_program
之前添加了一行。当板子上电时,执行my_C_program并执行完毕但SPI接口不输出任何数据。exit 0
/etc/rc.local
spictl
我尝试通过/etc/init.d/
脚本运行该程序这个链接。脚本工作正常并且执行my_C_program
,程序执行spictl
成功(如system()
返回值所示),但SPI接口不输出任何数据!
ls -l /usr/sbin/my_C_program
-rwxrwxrwx 1 root root 61713 Jun 28 2013 /usr/sbin/my_C_program
top
表明该程序以 root 身份运行
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1095 root 20 0 2524 1140 924 R 4.2 1.8 0:00.35 top
1033 root RT 0 35092 34m 1852 S 3.0 56.5 0:14.06 node
问题
如果我在终端上执行my_C_program
,程序会调用spictl
(via system(spictl someparameters)
) 并且执行没有任何问题。但如果我运行my_C_program
或/etc/rc.local
编写/etc/init.d
脚本,则spictl
无法按预期工作。我怀疑这与root权限有关。当我在终端(以 root 身份)上执行程序时,一切正常。但我猜想/etc/rc.local
以/etc/init.d
某种方式以较低的权限运行该程序。我无法真正解决以 root 身份从终端执行命令或通过脚本执行程序之间的/etc/rc.local
区别/etc/init.d/
。如果您也认为这是权限问题,请您解释一下如何确保init.d脚本或rc.local以最高权限运行程序。或者可能是什么问题?
请注意,该问题与 SPI 无关。
PS,为了避免出现不必要的对话,例如“哦,Debian lenny 太旧了,你应该使用 wheezy 等”,该板具有 armv4l 处理器,并且正如生产者所说,由于某些处理器指令,它不支持 wheezy。
答案1
您的 C 可执行文件可能需要设置一些环境变量才能运行。例如环境。变量$PATH
或$LD_LIBRARY_PATH
.还有其他变量,例如$HOME
在用户登录之前不会设置的变量。
例如,最后一项可能是您的应用程序访问配置文件和/或日志文件所必需的。
答案2
要调查发生了什么,请将程序的输出(尤其是错误)重定向到文件。
/usr/sbin/my_C_program >/root/my_C_program.out 2.>&1
如果这没有给出任何线索,请打开大炮:安装斯特雷斯。
strace /usr/sbin/my_C_program -o /root/my_C_program.from_etc_local.strace
还可以从命令行运行该程序并比较跟踪结果。即使您不明白大多数行在做什么,痕迹不同的前几行应该会提供线索。忽略大多数仅涉及整数值的差异,因为这些差异通常是由于不同的加载地址造成的,并重点关注系统调用的不同之处。
最有可能的是,程序正在寻找某个文件,但由于从不同的目录调用该文件而无法找到该文件,或者因为PATH
某些其他环境变量未设置为从 启动程序时所期望的值/etc/rc.local
。