[커널에서 쉘명령하기 system()함수]
보통 command line 명령어를 프로그램 상에서 실행 시키려고 할때는 보통
pid = fork();
switch(pid)
{
case -1:
return -1;
case 0: /* child process */
execlp();
break;
}
do
{
child_pid = waitpid(pid, (int *)0, WNOHANG);
usleep(10000); // 10ms delay
}while( child_pid == 0 );
이런 코드를 사용하여 처리 하곤 한다.
그런데 이런방법으로는 '>'를 사용해야하는 명령어가 처리가 되지 않는다는것을 알았다.
이를테면 ls -al > ls.txt 라는 명령어는 실행이 되지 않는다는 것이다.
그래서 다른 방법이 없을까 찾아본 결과 system() 이라는 함수를 발견하게 되었다.
밑에글 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/3/system
1.1. 사용법
#include <stdlib.h> int system(const char *string); |
1.2. 설명
system() 함수는 /bin/sh -c string를 호출하여 string에 지정된 명령어를 실행하고, 명령어가 끝난후 반환한다. 명령어가 실행동안, SIGCHLD는 블럭되며, SIGINT, SIGQUIT는 무시된다. system() 함수는 기본적으로 fork()와 execve()의 조합응용이다.
1.3. 반환값
만약 /bin/sh를 실행시키기 위한 execve()의 호출이 실패했다면 127이 리턴되며, 다른 에러가 있다면 -1, 그렇지 않다면 명령어의 리턴코드가 반환된다.
string값이 NULL이고, system()이 shell을 이용할 수 있다면 0이 아닌 값을 그렇지 않다면 0을 반환한다.
1.4. 예제
#include <unistd.h> #include <stdio.h> int main(int argc, char **argv) { int i = 0; int retval; retval = system("ls -al"); printf("Exit Status %d\n", retval); } |