자식 스레드에서의 exec 실행에 대한 질문입니다.
486
작성한 질문수 158
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
1
흥미로운 실험이네요!! 하지만 기대했던 대로 결과가 나오진 않으셨나보네요 :-( 그래도 새로운 시도.. 아주 좋습니다!
exec() 계열의 API는 기본적으로 새로운 프로그램을 로딩하고, 새로운 프로그램 이미지를 실행하게 됩니다. 따라서 동작중인 프로세스가 single-thread/multi-thread 여부에 관계 없이 모두 종료되고 새로운 프로그램을 실행하게 됩니다. 이 때 pthread_join()에서 기다리고 있을 main thread도 같이 종료됩니다. 그래서 "after exec"은 출력되지 않고, ls가 실행되고나서 프로그램이 완전히 종료됩니다.
동작 중이던 프로세스를 그대로 둔 채로 외부 프로그램을 띄웠다가 외부 프로그램이 종료되고나서 원래 프로세스가 동작을 이어나가기 위해서는 fork() & exec()이 필요합니다. fork()와 exec()가 항상 붙어다니는 이유죠 :)
inotify 객체에 등록된 watch descriptor 해제 관련 질문
0
37
2
select API 실습 코드 질문
0
41
2
wsl에서 fcntl사용
0
73
2
inotify_event 구조체 질문 [파일 이벤트 - 라이브 프로그래밍]에서...
0
180
2
./stat 파일이름
0
273
2
fopen r, r+모드 차이
0
460
2
강의를 모두 수강하고 스스로 구현하면 좋을 과제나 프로젝트 주제가 있을까요?
0
326
1
pthread 질문
0
419
2
I/O Multiplexing(select) 질문
0
325
1
inotify.c. ret 질문
0
302
1
inotify.c 질의합니다.
1
317
1
child process
0
715
1
read/blocking
0
565
1
flock
0
565
1
system call
0
598
1
pthread_create() 함수 이용했을 때, thread가 두번 호출되는 것 처럼 나타납니다. 왜 그런것인가요?
0
487
1
fork() 함수 사용시 결과 관련 질문
0
371
1
exec 관련 궁금한 사항
0
450
2
파일 디스크립터와 FILE 구조체에 대한 질문
0
552
1
buf 선언에 따른 read() fail 문제
0
251
2
파일 이벤트 - 라이브 프로그래밍 에서 캐스팅 질문
0
254
1
2번 multi thread 방법 질문
0
242
1
segmentation fault 발생 관련 문의
1
842
1
라이브 코딩 실습 코드
0
235
1





