함수 기능
기존 프로세스가 새 프로세스를 생성할 떄 사용하는 시스템호출 함수
자식은 부모의 자료구조, 힙 , 스택의 복사본을 가지기 때문에 동일한 메모리영역을 공유하여 사용하진않지만 텍스트 구역은 공유하여 사용한다. 일반적으로 부모와자식의 실행순서는 알수가 없다.
함수 원형
#include <unistd.h>
pid_t fork();
리턴 값 : 자식프로세스인 경우 0, 부모프로세스인경우 자식의 pid 에러시 -1
함수 예제
fork1
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
char glob_str[] = "write to standard output\n";
int glob_val = 10;
int main(void){
pid_t pid;
int loc_val;
loc_val = 100;
if( write(STDOUT_FILENO, glob_str, sizeof(glob_str)-1) != sizeof(glob_str)-1){
fprintf(stderr, "write error\n");
exit(1);
}
printf("before fork\n");
if((pid = fork())<0){
fprintf(stderr,"fork error\n");
exit(1);
}
else if(pid ==0){
glob_val++;
loc_val++;
}
else
sleep(3);
printf("pid = %d, glob_val = %d, loc_val = %d\n", getpid(), glob_val, loc_val);
exit(0);
}
첫 before fork 문자열 출력 후 버퍼에 문자열이 남아있는 상태에서 자식프로세스 관련 정보가 출력되고 그 후 부모프로세스가 대기상태가 해제되면서 출력된다.
fork2
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc, char *argv[]){
pid_t pid;
char character, first, last;
long i;
if((pid=fork())>0){
first = 'A';
last = 'Z';
}
else if(pid==0){
first = 'a';
last = 'z';
}
else{
fprintf(stderr, "%s\n", argv[0]);
exit(1);
}
for(character = first; character <= last; character++){
for(i = 0; i<=100; i++);
write(1, &character, 1 );
}
printf("\n");
exit(0);
}
fork3
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
static void ssu_charatatime(char *str);
int main(void){
pid_t pid;
if((pid = fork())<0){
fprintf(stderr, "fork error\n");
exit(1);
}
else if(pid==0)
ssu_charatatime("output from child\n");
else
ssu_charatatime("output form parent\n");
exit(0);
}
static void ssu_charatatime(char *str){
char*ptr;
int print_char;
setbuf(stdout, NULL);
for(ptr = str; (print_char = *ptr++)!= 0;){
putc(print_char, stdout);
usleep(10);
}
}
함수 결과
fork1
fork2
fork3
리눅스시스템 프로그래밍 - 홍지만 저
교재 내에 있는 예제를 바탕으로 작성한 글 입니다.
'C & LINUX' 카테고리의 다른 글
C / LINUX setjmp(3) longjmp(3) (0) | 2022.05.02 |
---|---|
C / LINUX vfork() (0) | 2022.05.02 |
C / LINUX opendir(3) readdir(3) rewinddir(3) closedir(3) telldir(3) seekdir(3) (0) | 2022.05.02 |
C / LINUX utime() (0) | 2022.05.02 |
C / LINUX getcwd(2) get_current_dir_name(2) (0) | 2022.05.02 |