-
카테고리
-
세부 분야
시스템
-
해결 여부
미해결
자식 스레드에서의 exec 실행에 대한 질문입니다.
19.06.03 19:24 작성 조회수 362
1
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;
}
답변을 작성해보세요.
1
ProgCoach4U
지식공유자2019.06.04
흥미로운 실험이네요!! 하지만 기대했던 대로 결과가 나오진 않으셨나보네요 :-( 그래도 새로운 시도.. 아주 좋습니다!
exec() 계열의 API는 기본적으로 새로운 프로그램을 로딩하고, 새로운 프로그램 이미지를 실행하게 됩니다. 따라서 동작중인 프로세스가 single-thread/multi-thread 여부에 관계 없이 모두 종료되고 새로운 프로그램을 실행하게 됩니다. 이 때 pthread_join()에서 기다리고 있을 main thread도 같이 종료됩니다. 그래서 "after exec"은 출력되지 않고, ls가 실행되고나서 프로그램이 완전히 종료됩니다.
동작 중이던 프로세스를 그대로 둔 채로 외부 프로그램을 띄웠다가 외부 프로그램이 종료되고나서 원래 프로세스가 동작을 이어나가기 위해서는 fork() & exec()이 필요합니다. fork()와 exec()가 항상 붙어다니는 이유죠 :)
0
0
답변 3