Skip to content

Instantly share code, notes, and snippets.

@devkoriel
Last active June 11, 2020 17:38
Show Gist options
  • Save devkoriel/b6e5f2c9a59286c90da5c42e4d5d4729 to your computer and use it in GitHub Desktop.
Save devkoriel/b6e5f2c9a59286c90da5c42e4d5d4729 to your computer and use it in GitHub Desktop.
Print Fibonacci sequence using fork()
#include <stdio.h>
#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char* argv[])
{
int arg = atoi(argv[1]); // 시스템 인자를 정수형으로 변환
long long fib_0 = 0, fib_1 = 1, fib_n;
pid_t pid, pid_child;
int status;
if (argc == 1) { // 시스템 인자가 없을 경우
printf("%s\n", "Please provide the number of sequence.");
} else if (arg < 0) { // 시스템 인자가 음수일 경우
printf("%s\n", "Please provide the positive number of sequence.");
} else {
pid = fork(); // fork system call 호출. 프로세스를 생성한다.
if (pid == -1) { // 프로세스 생성에 실패한 경우
perror("Fork failed");
exit(EXIT_FAILURE); // 프로세스 종료
} else if (pid == 0) { // 프로세스가 성공적으로 생성된 경우
// 자식 프로세스
printf("%s\n", "Child forked.");
printf("%lld, %lld", fib_0, fib_1);
// 피보나치 수열 출력
for(register int i = 1; i < arg - 1; i++) {
fib_n = fib_0 + fib_1;
fib_0 = fib_1;
fib_1 = fib_n;
printf(", %lld", fib_n);
}
printf("\n%s\n", "Child ended.");
_exit(EXIT_SUCCESS); // 자식 프로세스 종료
} else {
// 부모 프로세스
printf("%s\n", "Parent is waiting for the child to complete.");
pid_child = wait(&status); // 자식 프로세스가 종료될 때까지 대기
printf("Ended child process id is %d\n", pid_child); // 종료된 자식 프로세스의 ID 출력
if ((status & 0xFF) == 0) { // 자식 프로세스가 성공적으로 종료된 경우
printf("Child process ended successfully. Status: %d\n", status >> 8);
} else { // 자식 프로세스가 성공적으로 종료되지 않은 경우
printf("Child process ended unsuccessfully. Status: %d\n", status);
}
}
}
return EXIT_SUCCESS;
}
@goodsosbva
Copy link

good

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment