본문 바로가기
임베디드SW 기초

시스템 프로그래밍(3) - 프로세스 관련 시스템 콜

by sw-develop-record 2025. 2. 26.
  • fork(): 자식 프로세스를 생성합니다. 부모 프로세스에서는 자식의 PID를 반환하고, 자식 프로세스에서는 0을 반환합니다.
  • exec(): 현재 프로세스를 새로운 프로그램으로 대체합니다.
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();
    
    if (pid < 0) {
        perror("fork 실패");
        return 1;
    } 
    else if (pid == 0) {
        // 자식 프로세스에서 새 프로그램 실행
        printf("자식 프로세스가 ls 명령을 실행합니다...\\n");
        
        // execl 함수로 ls 명령 실행
        execl("/bin/ls", "ls", "-l", NULL);
        
        // exec 호출이 성공하면 아래 코드는 실행되지 않음
        perror("exec 실패");
        return 1;
    } 
    else {
        // 부모 프로세스는 자식이 종료될 때까지 대기
        printf("부모 프로세스가 자식(PID: %d)을 기다립니다...\\n", pid);
        wait(NULL);
        printf("자식 프로세스 종료됨\\n");
    }
    
    return 0;
}


  • wait(): 자식 프로세스가 종료될 때까지 기다립니다.
  • exit(): 프로세스를 종료합니다.
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    pid_t pid = fork();  // 프로세스 복제
    
    if (pid < 0) {
        // fork 실패
        perror("fork 실패");
        return 1;
    } 
    else if (pid == 0) {
        // 자식 프로세스 코드
        printf("자식 프로세스 실행 중 (PID: %d, 부모 PID: %d)\\n", 
               getpid(), getppid());
        
        // 자식 프로세스 종료
        exit(42);  // 종료 상태 코드 42로 설정
    } 
    else {
        // 부모 프로세스 코드
        printf("부모 프로세스 실행 중 (PID: %d, 자식 PID: %d)\\n", 
               getpid(), pid);
        
        // 자식 프로세스가 종료될 때까지 대기
        int status;
        wait(&status);
        
        if (WIFEXITED(status)) {
            printf("자식 프로세스가 종료 코드 %d로 종료됨\\n", 
                   WEXITSTATUS(status));
        }
    }
    
    return 0;
}


  • getpid(): 현재 프로세스의 ID를 반환합니다.
  • getppid(): 부모 프로세스의 ID를 반환합니다.
#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t my_pid = getpid();
    pid_t parent_pid = getppid();
    
    printf("현재 프로세스 ID: %d\\n", my_pid);
    printf("부모 프로세스 ID: %d\\n", parent_pid);
    
    return 0;
}


  • kill(): 특정 프로세스에 시그널을 보내고 제어합니다.
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

// 시그널 핸들러
void signal_handler(int signum) {
    printf("시그널 %d 수신됨\\n", signum);
}

int main() {
    pid_t pid = fork();
    
    if (pid < 0) {
        perror("fork 실패");
        return 1;
    } 
    else if (pid == 0) {
        // 자식 프로세스: 시그널 핸들러 등록
        signal(SIGUSR1, signal_handler);
        
        printf("자식 프로세스(PID: %d)가 시그널을 기다립니다...\\n", getpid());
        
        // 시그널을 기다리며 일시 정지
        pause();
        
        printf("자식 프로세스가 계속 실행됩니다.\\n");
        exit(0);
    } 
    else {
        // 부모 프로세스: 잠시 대기 후 자식에게 시그널 전송
        sleep(1);
        printf("부모 프로세스가 자식(PID: %d)에게 SIGUSR1 시그널을 보냅니다.\\n", pid);
        
        // SIGUSR1 시그널 전송
        kill(pid, SIGUSR1);
        
        // 자식 프로세스가 종료될 때까지 대기
        wait(NULL);
        printf("자식 프로세스 종료됨\\n");
    }
    
    return 0;
}