강좌 & 팁
C 프로그램을 하다보면 이런저런 귀챦음으로 인해 system() 함수를 사용하게된다.
파일 지우기나 네트웍을 통해 파일 가져오기( tftp ) 등 여러 꼼수가 등장한다.
system() 함수에 대한 여러 경고가 있지만 나는 임베디드를 다루기 때문에 보안은 문제가 되지 않는다.
system() 함수의 보안 문제는 인터넷을 찾아보면 자세히 나온다.
이런것 테스트할때는 역시 임베디드 보드가 최고당.. ^^
system() 함수에 대한 몇가지 실험을 통해 어떻게 사용해야 하는지를 파악하려고 한다.
답: 내 프로그램에는 영향이 없다.
답: 내 프로그램은 계속 멈춰져 있다. 이런 증상으로 인해 내 프로그램에 버그가 있나 의심하게 된다
답: 쉘 스크립트로 실행시킨다... 아래 소스를 참고하자
- 테스트 프로그램 소스 main.c
- 일정시간 지연 후 폴트가 나는 소스 main-fault.c
- 사용한 컴파일러 arm-generic-linux-gnueabi-gcc
- 사용한 임베디드보드 SIB-G100 for EM-S3C6410
main.c
(컴파일 방법 arm-generic-linux-gnueabi-gcc -o app-test main.c )
#include <stdio.h>
//------------------------------------------------------------------------------
/** @brief main
@remark
*///----------------------------------------------------------------------------
int main( int argc, char **argv )
{
printf( "before system()\n" );
//system( "./app-fault" ); // 위험한(?) 사용법 (이런방식으로 테스트 해보자)
system( "./run.sh" ); // 추천하는 사용법
/* run.sh 의 내용
#/bin/sh
./app-fault &
*/
printf( "after system()\n" );
return 0;
}
main-fault.c
(컴파일 방법 arm-generic-linux-gnueabi-gcc -o app-fault main-fault.c )
#include <stdio.h>
//------------------------------------------------------------------------------
/** @brief main
@remark
*///----------------------------------------------------------------------------
int main( int argc, char **argv )
{
char *bad = (char *)0x1000;
printf( "start fault\n" );
sleep(5); // 테스트를 위해 5초 지연
*bad = 44; // fault!!
printf( "end fault()\n" );
return 0;
}
run.sh
#/bin/sh
./app-fault &
위까지의 글을 쓰고 하룻밤을 자고 아침이 되니 이런 생각이 든다.
system( "./my-app" ); 이렇게 하면 프로그램 흐름이 병렬로 가지않아 코딩이 쉬워진다.
system( "./my.sh" ); 요런 방식은 병렬 흐름이 되어 수행결과를 알기 어렵다.
이런 경우 어떤 해결 방법이 있을까 하고 고민하다 보니 thread 를 사용하는 방법이 있을 수 있다.
system( ) 함수 호출을 쓰레드를 생성하여 분리한다면 실행 종료를 알게 되어 동기화가 용이할 것이다.