배경:
나는 임베디드 장치에서 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 앞에 한 줄을 추가했습니다. 보드의 전원이 켜지면 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
프로그램이 루트로 실행 중임을 나타냅니다.
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
작성 하면 예상대로 작동하지 않습니다. 나는 이것이 루트 액세스와 관련이 있다고 생각합니다. 터미널에서 (루트로) 프로그램을 실행하면 모든 것이 잘 작동합니다. 하지만 어떻게든 더 낮은 권한으로 프로그램을 실행하는 것 같아요 . 터미널에서 루트로 명령을 실행하는 것과 스크립트를 통해 프로그램을 실행하는 것의 차이점을 실제로 알 수는 없습니다 . 이것이 권한 문제라고 생각된다면 init.d 스크립트 또는 rc.local이 가장 높은 권한으로 프로그램을 실행하는지 확인하는 방법을 설명해 주시겠습니까? 아니면 무엇이 문제일까요?/etc/init.d
spictl
/etc/rc.local
/etc/init.d
/etc/rc.local
/etc/init.d/
이 문제는 SPI와는 아무런 관련이 없습니다.
PS, "아, 데비안 레니는 너무 늙었으니 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
.