작성
·
688
1
child process 코드 영역에서 execl()이 fail하게되면
printf("execl() fail\n");
return -1이 실행되는것으로 예측하고 parent측에서 exit_status -1을 출력할 줄 알았는데 2가 되는 이유를 모르겠어요
답변 4
1
올려주신 코드 그대로 컴파일해서 실행해보니 다음과 같은 결과가 출력되었습니다.
[progcoach4u@ubuntu18-04 test]$ ./test
origin process pid:18416
execl() fail
child 18417 return 255
[progcoach4u@ubuntu18-04 test]$
결과값이 2가 아니라 255가 나오는데.. 2가 나오는 것이 맞나요?
255가 리턴되는 것은 정상입니다. child process가 리턴하는 값은 integer인데 exit status는 0~255 까지의 값만 갖게 됩니다. 즉, child가 리턴하하는 값을 0xff로 mask한 값을 실제 exit status 값으로 받아오게 됩니다. 따라서 -1을 리턴하면 255를 받아오고, 256을 리턴하면 0을 받아오게 됩니다. 위의 코드 실행 결과가 255인 것만 다시 확인하면 될 것 같습니다. 실행 결과를 다시 한번 확인해주세요~
감사합니다.
1
안녕하세요. 장원일님.
죄송하지만 질문이 정확히 이해가 되지 않습니다ㅠㅠ
execl() API가 실패를 한 것인가요?
아니면 새로 실행한 프로그램에서 exit status를 -1로 종료했다는 말인가요?
그리고 2가 됐다는 것은 어느 부분에서 어떻게 확인하신 것인가요?
시험환경에 대해 좀 더 상세한 설명을 주시거나, 코드를 올려주시면 답변 드리도록 하겠습니다.
일반적으로 fork & exec를 통해 child process의 exit status를 확인하는 것은 아래와 같은 절차로 진행하실 수 있습니다.
1. fork()로 child process를 만든다
1.1 parent process는 child process에 대해 wait() 계열의 API를 이용해 child process의 종료를 기다린다.
2. child process가 execl()을 이용해 새로운 프로그램을 실행한다
3. child process가 실행한 프로그램은 main 함수에서 -1을 리턴 혹은 exit(-1)을 호출한다.
1.2 parent process는 wait()에서 깨어나 WEXITSTATUS()로 child process의 exit_status를 확인한다.
감사합니다~
0
아마 /bin/ls인데 제가 bin/ls라고 적어서 그런거같네요. 답변 되었습니다. 저럴때 execl() api 호출이 에러가되군요
그리고 mask한다는게 ff랑 and연산한다는거죠?
0
ㅂ제가 질문이 구체적이지 못했네요.
int main(int argc, char** argv){
pid_t pid;
int exit_status;
printf("origin process pid:%d\n",getpid());
pid=fork();
if(pid == 0){
if( execl("bin/ls","ls", "-al","존재하지않는 파일 이름",NULL) == -1){
printf("execl() fail\n");
return -1;
}
}
pid=wait(&exit_status);
if(WIFEXITED(exit_status)){
printf("child %d return %d\n", pid, WEXITSTATUS(exit_status));
}
return 0;
}
api에러 처리하는 부분에서 return -1;로 종료하게 되면
아래 부모 프로세스에서 자식 프로세스의 종료코드를 출력하는 부분에서 -1이 출력될거라고 예상했지만. 실제로 해보면 2가 출력됩니다.. 잘 생각해보니 2가 ls명령의 exit staus이네요..
그러면 실제로 execl가 -1을 리턴하는 상황은 어떤 경우가 있는지 궁금합니다.