2016-09-12 2 views
-1

그물이 예를 발견하고 성공적인 반환하지 execl A가의 man page 볼이 라인이이 줄이 인쇄되지 않는 이유는 무엇입니까? (C++ 스레드)

#include<stdlib.h> 
#include<unistd.h> 

int main() 
{ 
    pid_t return_value; 

    printf("Forking process\n"); 
    return_value=fork(); 
    printf("The process id is %d 
     and return value is %d\n", 
     getpid(), return_value); 
    execl("/bin/ls/","ls","-l",NULL); 
    printf("This line is not printed\n"); 
} 
+2

묻기 전에 관련된 모든 기능에 대한 문서를 읽었습니까? 'execl'이하는 일처럼? 그리고 BTW,'포크'는 과정이 아니라 스레드를 만듭니다. – Angew

답변

5

을 인쇄 할 수없는 이유를 찾을 수 없습니다 :

exec() 함수는 오류가 발생한 경우에만 리턴합니다.

대신, 호스트 프로세스는이 경우의 ls 프로세스 이미지 exec 보내고 무엇으로 대체됩니다 :

exec 함수() 가족이 새와 현재의 프로세스 이미지를 대체 프로세스 이미지.

이 방법을 사용하면 프로그램이 메모리에서 마지막 printf 문에 도달하기 전에 바뀌어 프로그램이 실행되지 않습니다.

1

exec*() 기능은 특별한 의미에서 이 아닌입니다. 이 기능의 일반적인 구현은 현재 프로세스의 모듈을 현재 프로세스의 새 프로그램 시작과 실질적으로 동일하게 "대체"합니다. 귀하의 경우 새 프로그램은 /bin/ls입니다. execl() 동안 모든 이전 이미지가 프로세스에서 언로드되고 /bin/ls 및 모든 종속성이로드되고 컨트롤이 /bin/ls의 엔트리 포인트로 전달됩니다.이 엔트리 포인트는 main() 함수를 호출합니다.

execl() 이후에 제어권을 반환 할 곳이 없기 때문에 현재 프로세스의 주소 공간에 더 이상 호출하지 않는 모듈이 있기 때문에 제어권을 반환 할 곳이 없습니다.

관련 문제