system() 함수에 대해

Posted by 알거없어요
2014. 12. 17. 16:22 Programming/QT

C 프로그램을 하다보면 이런저런 귀챦음으로 인해 system() 함수를 사용하게된다.

파일 지우기나 네트웍을 통해 파일 가져오기( tftp ) 등  여러 꼼수가 등장한다.


system() 함수에 대한 여러 경고가 있지만 나는 임베디드를 다루기 때문에 보안은 문제가 되지 않는다.

system() 함수의 보안 문제는 인터넷을 찾아보면 자세히 나온다.

이런것 테스트할때는 역시 임베디드 보드가 최고당.. ^^



system() 함수에 대한 몇가지 실험을 통해 어떻게 사용해야 하는지를 파악하려고 한다.


1.  프로그램내에서  system() 함수를 실행하게 되면 system() 함수가 종료될때 까지 멈추는가? 

  답: 그렇다. (넘 단순한가)


2.  system() 함수를 통해 실행된 프로그램이 에러를 내고 종료했다면 내 프로그램은 무사한가?

  답: 내 프로그램에는 영향이 없다.


3.  system() 함수를 통해 실행된 프로그램이 무한 루프를 돌고 있다면 내 프로그램은 어떻게 되는가?

  답: 내 프로그램은 계속 멈춰져 있다.  이런 증상으로 인해 내 프로그램에 버그가 있나 의심하게 된다


4.  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( ) 함수 호출을 쓰레드를 생성하여 분리한다면 실행 종료를 알게 되어 동기화가 용이할 것이다.