자식 스레드에서의 exec 실행에 대한 질문입니다.

미해결질문
유영재 프로필

fork 후 자식 프로세스에서 exec를 실행하면 완전히 프로세스가 구분되어져서 , pid == 0 ㅇ안에서 exec 뒤에 있는 소스는 실행이 전혀 되지 않았습니다

그런데 스레드에서는 조금은 다르게 같은 스레드 그룹이라서 

"after exec"가 실행될줄 알았는데 실제론 그렇지 않네요...

 

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void *child_thread_main(void *arg)
{
    printf("Before exec\n");
    execl("/bin/ls", "-al", NULL);
    printf("After exec\n");

    return NULL;
}

int main(int argc, char **argv) 
{    
    int ret;
    pthread_t child_thread;
    
    ret = pthread_create(&child_thread, NULL, child_thread_main, NULL);
    if(ret) {
        printf("pthread_create(%d)\n", ret);
        return -1;
    }
    
    ret = pthread_join(child_thread, NULL);
    if(ret) {
        printf("pthread_join(%d), str_err:%s\n", 
                ret, strerror(ret));
        return -1;
    }

    printf("Done..\n");
    return 0;
}
유영재 프로필
유영재 3달 전

execl 함수는 새로운 실행함수이기 때문에, 프로세스 생성은 불가피하기 때문에 fork에서와의 차이가 없는건가요?

ProgCoach4U 프로필
ProgCoach4U 3달 전

흥미로운 실험이네요!! 하지만 기대했던 대로 결과가 나오진 않으셨나보네요 :-( 그래도 새로운 시도.. 아주 좋습니다!

exec() 계열의 API는 기본적으로 새로운 프로그램을 로딩하고, 새로운 프로그램 이미지를 실행하게 됩니다. 따라서 동작중인 프로세스가 single-thread/multi-thread 여부에 관계 없이 모두 종료되고 새로운 프로그램을 실행하게 됩니다. 이 때 pthread_join()에서 기다리고 있을 main thread도 같이 종료됩니다. 그래서 "after exec"은 출력되지 않고, ls가 실행되고나서 프로그램이 완전히 종료됩니다. 

동작 중이던 프로세스를 그대로 둔 채로 외부 프로그램을 띄웠다가 외부 프로그램이 종료되고나서 원래 프로세스가 동작을 이어나가기 위해서는 fork() & exec()이 필요합니다. fork()와 exec()가 항상 붙어다니는 이유죠 :)

유영재 프로필
유영재 3달 전

와.. 개념이 바로 잡혔습니다 이제!!