我有一个C程序需要在我打开机器时运行(Red Pitaya)。 这里提出的计划的开头:
//my_test program
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "redpitaya/rp.h"
int main(int argc, char **argv){
int jj=1;
while(1) {
printf("Ready for experiment number %i\n",jj);
int i, D;
int32_t TrigDly;
依旧......
程序可以使用名为uri_test.sh
的run.sh文件执行,该文件包含以下内容:
cat /opt/redpitaya/fpga/fpga_0.94.bit>/dev/xdevcfg
LD_LIBRARY_PATH=/opt/redpitaya/lib ./my_test
这两个文件都位于/ root下的目录中。在PuTTY终端上手动运行时程序运行正常 -
/RedPitaya/Examples/C/Uri# ./my_test
或
/RedPitaya/Examples/C/Uri# ./uri_test.sh
我试着按照这里提出的解决方案:
https://askubuntu.com/questions/9853/how-can-i-make-rc-local-run-on-startup
没有成功。 有什么建议?谢谢。
答案 0 :(得分:2)
有几种方法可以让程序在启动时运行,它取决于你的init子系统(你使用systemd还是SysV风格的init?)。
BTW,C中的源程序不是script,你通常将它(使用gcc -Wall -Wextra -g
)编译成一些executable。在您的情况下,您可能希望在构建时设置rpath(特别是为了避免LD_LIBRARY_PATH
疯狂),可能会将-Wl,-rpath,/opt/redpitaya/lib
之类的内容传递给您的链接{{1}命令。
也许带有gcc
的{{3}}条目就足够了。
无论您在启动时启动程序的方式如何,通常都会重定向其 stdin , stdout , stderr 流(例如@reboot
,见crontab(5))或不可用。因此,您的/dev/null
输出可能无处可去。您可以在脚本中重定向stdout,我建议您在C程序中使用null(4),在shell脚本中使用syslog(3)(然后再查看printf
下的*.log
文件})。顺便说一句,它的环境与某些交互式shell中的环境不同(请参阅logger(1) ...),因此您的程序可能很早就失败了(可能是在动态链接时,请参阅environ(7),因为{{ 1}}可能没有设置为你想要的...)。
您应该考虑在C程序中处理程序参数(可能使用ld-linux.so(8))并且可能有一些选项(例如/var/log/
),这可以调用getopt_long(3)。
你当然应该阅读daemon(3)或类似内容。
我建议首先能够成功构建然后在启动时使用Advanced Linux Programming运行一些类似程序的“hello-world”。稍后,您可以改进该程序,使其适用于您的Red Pitaya事物。