C언어 header/stdlib.h
system(3) - 명령어를 실행하기 : fork(2) + execl(3)
자연&사람
2019. 10. 4. 18:08
반응형
system(3)
#include <stdlib.h>
int system(const char *command);
process에서 새로운 프로그램을 실행하기 위해서는 fork()로 child process를 생성하고, child process의 binary를 실행을 하려는 프로그램으로 대체하는 exec 계열의 함수를 호출하여야 합니다. 실행하기 매우 귀찮은 작업입니다.
이 system(3)함수는 이 작업을 매우 편리하게 해주는 함수입니다.
이 함수의 호출은 아래와 비슷한 형태로 실행됩니다.
int system(const char *command);
{
pid_t child_pid;
int status;
......
child_pid = fork();
if(child_pid == 0) // child process이면
{
if(execl("/bin/sh", "sh", "-c", command, (char *) NULL) == -1)
{
_exit(127);
}
}
else if(child_pid > 0) // parent process이면
{
waitpid(child_pid, &status, 0);
return WEXITSTATUS(status);
}
else // 오류가 발생하였습니다.
{
return -1;
}
}
system(3)함수를 실행하게 되면, 이 함수를 호출한 부모 process는 SIGCHLD signal이 발생할 때까지 blocking 상태가 되고, SIGINT, SIGQUIT은 무시합니다.
만약, command가 NULL이면 이 시스템에서 /bin/sh shell이 유효한지 체크할 수 있습니다.
파라미터
command
- 실행하려는 명령어 또는 shell 프로그램 등에 대한 pull path 또는 상대 path
- 만약 PATH 환경변수에 등록된 PATH이면 명령어만 입력하면 됩니다.
RETURN
command가 NULL일때
0
- sh가 사용할 수 없는 상태
0이 아님
- sh가 사용할 수 있는 상태
command가 NULL이 아닐때
- child process가 생성되지 않은 경우
-1이 return되고 errno오 오류가 설정되며, status의 값이 채워지지 않는다.
errno의 값은 fork(2)함수의 결과와 같습니다.
- child process에서 command를 실행할 수 없으면
status의 값이 127로 설정됩니다.
- 정상적으로 실행했다면
명령어 종료 상태 값을 return 합니다.
WIFEXITED(), WEXITSTATUS() 등의 macro함수로 체크해야 합니다. (waitpid(2) 참조)
활용 예제
Sample
#include <stdlib.h>
....
system("chmod 644 /home/user1/sample.txt");
see also : fork(2) execl(3) Process 관리 함수
반응형