간만에 스택오버플로우를 보다가 재밌는 질문을 발견했다.
RUNNING 상태인 프로세스에서 exec() 시스템 콜로 호출하면 부모 프로세스 -> 자식 프로세스 -> 부모 프로세스 처럼 원활환 진행 플로우가 나오게 되는데 프로세스에서 thread를 생성하고 해당 생성된 thread에서 exec()를 호출하게 된다면 어떻게 되냐는 질문이었다.
보자마자 생기는 후폭풍 같은것이 바로 생각되지 않았다.
그래서 코드로 작성해서 결과를 봤는데
코드는 다음과 같다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sched.h>
int main(){
pid_t pid;
pid = fork();
if(pid < 0){
fprintf(stderr,"Fork Failed");
return 1;
}
else if(pid == 0){
printf("[자식] 프로그램을 실행 합니다.\n");
execlp("ls","ls","-l",NULL);
perror("exec failed");
exit(1);
}
else{
printf("부모 프로그램이 자식 끝나기를 기다림\n");
wait(NULL);
printf("[부모] 자식 프로세스가 종료된 것을 확인\n");
}
return 0;
}
그냥 가볍게 프로세스 생성후 명령 실행
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
// 1. pthread_create에 들어갈 함수는 반드시 void* 를 받고 void* 를 반환해야 합니다.
void* thread_routine(void* arg) {
printf("[자식 쓰레드] 실행 중... 이제 ls -l 명령으로 프로세스를 교체합니다.\n");
execlp("ls", "ls", "-l", NULL);
perror("exec failed");
exit(1);
}
int main() {
pthread_t thread1;
int id1 = 1;
// 2. 쓰레드 생성
printf("부모 프로세스 실행중\n");
if (pthread_create(&thread1, NULL, thread_routine, (void*)&id1) != 0) {
perror("Thread 1 creation failed");
return 1;
}
if(pthread_join(thread1,NULL) != 0){
perror("phtread_join error");
return 1;
}
printf("메인 쓰레드 종료 \n");
return 0;
}
아래가 쓰레드 기반 exec인데 결과는 생각보다 놀랍게도 pthread나 메인 프로세스 자체가 메모리가 사라져서 exec로 생성한 것 밖에 남지 않는다는 것이었다.
그래도 제어 흐름은 돌아올 줄 알았는데 공부를 다시 해야겠다고 체감한 녀석이다...
'OS' 카테고리의 다른 글
| 커널 구조 (0) | 2026.02.19 |
|---|---|
| [TIL 53] 텍스트 파일과 바이너리 파일 탐지(구분)하는 법 (0) | 2025.04.25 |
| [TIL 48] 인증정보 관련 탐지 (0) | 2025.02.06 |
| [TIL 47] 파일의 읽기와 쓰기 (0) | 2025.01.22 |
| [TIL 46] 이론과 직접 느낀 파일 시스템 (0) | 2025.01.21 |