execvp 함수 동작에 대한 질문
글쓴이: freesky / 작성시간: 금, 2007/02/09 - 9:08오후
현재 리눅스 프로그래밍을 공부하고 있는데, 프로세서 관련 부분에서 다음과 같은 코드가 나왔습니다.
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int spawn(char *program, char **arg_list) { pid_t child_pid; child_pid = fork(); if (child_pid != 0) return child_pid; else { execvp(program, arg_list); fprintf(stderr, "an error occured in execvp\n"); abort(); } } int main() { char *arg_list[] = {"ls", "-l", "/", NULL}; spawn("ls", arg_list); printf("done with main program"); return 0; }
그런데 실행결과에서 fprintf 행은 실행이 안 되더군요. ls가 정상적으로 종료해서 실행이 안 되었을 거라고 생각하고, 비정상적으로 종료시키기 위해 '/'를 '/fsafs'로 고치고 다시 컴파일하여 실행해도 역시 마찬가지로 fprintf가 실행되지 않았습니다. 왜 그런가요?
컴파일은 cygwin 상에서 GCC 3.4.4로 했습니다.
Forums:
exec() 계열은 process image를 바꿉니다.
exec() 계열은 현재의 process image를 실행하려는 process image로 바꿉니다.
즉, execvp()를 실행시킨 processs는 중단됩니다.
따라서 위의 소스에서 fork를 통해 생성된 child process의 fprintf는 실행되지 않는 것이 맞습니다.
man execvp를 참조하세요.
--
코더에서 프로그래머까지
코더에서 프로그래머까지
댓글 달기