Manpages

이 름

system − shell 명 령 어 실 행 하 기

사 용 법

#include <stdlib.h>

int system (const char * string);

설 명

system() 함 수 는 /bin/sh -c string를 호 출 하 여 string 에 지 정 된 명 령 어 를 실 행 하 며 , 명 령 어 가 끝 난 후 반 환 된 다 . 명 령 어 가 실 행 되 는 동 안 , SIGCHLD 는 블 럭 되 며 , SIGINT 그 리 고 SIGQUIT 는 무 시 된 다 .

반 환 값

리 턴 된 값 은 만 일 /bin/sh 을 위 한 execve() 호 출 이 실 패 한 다 면 , 리 턴 된 값 은 127 이 며 , 다 른 에 러 가 있 다 면 −1, 그 렇 지 않 으 면 명 령 어 의 리 턴 코 드 가 반 환 된 다 .

string 값 이 NULL이 라 면 , system() 은 shell을 이 용 할 수 있 다 면 0 이 아 닌 값 을 , 그 렇 지 않 으 면 0 값 을 반 환 한 다 .

system() 은 어 떤 다 른 자 식 의 wait 상 태 에 영 향 을 주 지 않 는 다 .

호 환

ANSI C, POSIX.2, BSD 4.3

버 그

libc 버 전 의 system() 이 인 터 럽 트 를 무 시 한 다 는 것 은 매 우 불 행 한 일 이 다 . 이 것 은 함 수 후 출 시 루 프 에 서 인 터 럽 트 할 수 없 게 되 도 록 프 로 그 램 을 만 든 다 . 이 것 은 그 런 목 적 의 프 로 그 램 은 system() 이 아 닌 개 인 버 전 의 함 수 를 사 용 해 야 한 다 .(경 고 : 테 스 트 된 코 드 가 아 니 다 !)

int my_system (const char *command) {
int pid, status;

if (command == 0)
return 1;
pid = fork();
if (pid == -1)
return -1;
if (pid == 0) {
char *argv[4];
argv[0] = "sh";
argv[1] = "-c";
argv[2] = command;
argv[3] = 0;
execve("/bin/sh", argv, environ);
exit(127);
}
do {
if (waitpid(pid, &status, 0) == -1) {
if (errno != EINTR)
return -1;
} else
return status;
} while(1);
}

suid 나 sgid 우 선 권 이 있 는 프 로 그 램 에 서 는 system() 을 사 용 하 지 마 라 . 왜 냐 하 면 몇 몇 환 경 변 수 들 을 위 한 이 상 한 값 들 이 시 스 템 을 오 작 동 시 킬 수 있 기 때 문 이 다 . 대 신 에 exec(3) 계 열 의 함 수 를 사 용 해 라 . 그 러 나 execlp(3)execvp(3)은 제 외 해 라 . 사 실 system() 함 수 는 /bin/shbash 버 전 2인 시 스 템 에 서 suid 나 sgid 우 선 권 이 있 는 프 로 그 램 에 서 는 잘 작 동 하 지 않 는 다 . 왜 냐 하 면 bash 2는 시 작 시 우 선 권 을 없 애 기 때 문 이 다 . (Debian은 sh처 럼 구 동 시 이 것 을 하 지 않 는 수 정 된 bash를 사 용 한 다 .)

/bin/sh 의 유 용 성 검 사 는 실 제 적 으 로 는 행 해 지 지 않 는 다 ; 항 상 유 효 하 다 고 가 정 한 다 . ISO C는 검 사 를 지 정 하 지 만 , POSIX.2는 리 턴 값 은 항 상 0 이 아 닌 값 이 어 야 한 다 고 지 정 한 다 . 왜 냐 하 면 shell이 없 는 시 스 템 은 행 해 져 서 는 안 되 기 때 문 이 다 .

반 환 값 127은 shell 명 령 어 에 서 가 능 하 다 . 그 러 므 로 이 반 환 값 은 execve() 가 실 패 했 다 는 것 을 확 실 히 가 리 키 지 않 는 다 ; 확 신 을 위 해 errno 를 검 사 해 라 .

관 련 항 목

sh(1), signal(2), exec(3)

역 자

정 강 훈 <skyeyes [AT] soback.net>, 2001년 3월 12일