임베디드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;
}