背景:
私は組み込みデバイスでDebian Lennyを使用しています。
uname -a
Linux device 3.4.0 #83 Sun May 26 17:07:14 CEST 2013 armv4l GNU/Linux
my_C_program
ボード固有のバイナリを呼び出すCコード(例:SPIインタフェース呼び出しsystem("spictl someparameters")
)があります。spictl
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インターフェイスからデータを出力します。
質問:
ボードの電源が入った状態でプログラムを実行する必要があります。だから/user/sbin/my_C_program
atの前に1行追加しました。ボードの電源が投入されると 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
(経由でsystem(spictl someparameters)
)呼び出され、問題なく実行されます。ただし、スクリプトを実行my_C_program
または/etc/rc.local
作成すると、期待どおりに機能しません。私はこれがルートアクセスに関連していると思います。端末で(rootとして)プログラムを実行すると、すべてがうまく動作します。しかし、どういうわけか、より低い権限でプログラムを実行していると思います。端末でrootとしてコマンドを実行することと、スクリプトを介してプログラムを実行することの違いは実際にはわかりません。これが権限の問題であると思われる場合は、init.dスクリプトまたはrc.localが最高の権限でプログラムを実行しているかどうかを確認する方法を説明しますか?それとも何が問題なのでしょうか?/etc/init.d
spictl
/etc/rc.local
/etc/init.d
/etc/rc.local
/etc/init.d/
この問題は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
。