정처기 실기 프로그래밍 문제를 풀다가 C언어에서 fork함수가 나왔을 때 어렵다고 생각했는데, 아니나 다를까 흥달쌤의 최신 유튜브 강의에 Q&A에 답변해 주신 게 있었다.
개발에선 어렵고 복잡한 게 맞지만 정처기 문제를 풀 땐 단순하게 생각해서 풀면 된다고 한다.
(다들 나랑 똑같은 생각을 했나 보다 ㅎㅎ)
fork() 함수
'fork'는 프로세스를 생성하는 시스템 호출로, 새로운 자식 프로세스를 만들고, 부모 프로세스와 자식 프로세스 모두에서 반환된다.
✔️ 일단 fork 함수를 수행하면 세 가지 리턴값이 나올 수 있다.
- 부모 프로세스에서의 리턴값 : 양수
- 자식 프로세스에서의 리턴값 : 0
- 오류가 발생했을 때의 반환값 : 음수 => 시험에 나올 일 없다.
✔️ 찬물도 위아래가 있다 부모부터 수행하면 된다.
✔️ fork함수를 만났을 때 그냥 두 번 수행한다고 알아주면 된다.
위의 내용들을 참고해서 예제들을 풀어보자.
예제 1. C언어 프로그램의 출력 결과는? (단, 자식 프로세스의 생성을 성공하였다고 가정)
#include <stdio.h>
#include <unistd.h>
int main(void) {
int x = 0;
fork();
x = 1;
printf("%d\n", x);
return 0;
}
1
1
- fork() 호출 이후 코드가 두 번 실행되는데, 'x = 1'로 설정된 후 printf가 호출되므로, 두 프로세스 모두 '1'을 출력한다.
예제 2. C언어 프로그램의 출력 결과는? (단, "pid = fork();" 문장의 수행 결과 자식 프로세스의 생성을 성공하였다고 가정)
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void) {
int i = 0, v = 1, n = 5;
pid_t pid;
pid = fork();
if(pid < 0) {
for(i = 0; i < n; i++) v += (i + 1);
printf("c = %d ", v);
}
else if(pid == 0) {
for(i = 0; i < n; i++) v *= (i + 1);
printf("b = %d, ", v);
}
else {
wait(NULL);
for(i = 0; i < n; i++) v += 1;
printf("a = %d", v);
}
return 0;
}
b = 120, a = 6
- 부모 프로세스가 먼저 수행되어야 하지만 wait(NULL)이 있어서 자식 프로세스가 종료될 때까지 기다린다.
- 즉, 이 문제에서는 자식 프로세스가 먼저 실행되고 종료된 후 부모 프로세스가 실행된다.
✨👩💻 ✨
아직은 fork 함수가 낯설지만 쌤이 알려주신 것만 잘 생각하면 문제는 풀 수 있을 것 같다. (풀어야 함!!!)
출처
'Study > C언어' 카테고리의 다른 글
[C] C언어 기초 - 제어문, 반복문, 함수, 배열과 포인터 (0) | 2024.06.20 |
---|---|
[C] C언어 기초 - 변수, 연산자, 입출력 함수 (0) | 2024.06.18 |