Ocean_
꾸준한 프로그래밍
Ocean_
전체 방문자
오늘
어제
  • 분류 전체보기 (174)
    • About Me (4)
    • 우아한테크코스 (27)
    • C & LINUX (50)
    • Operating System (12)
    • Database (25)
    • Computer Vision (0)
    • Problem Solving (0)
      • Programmers (0)
      • BOJ (0)
    • 코코코딩공부 (44)
      • Spring (12)
      • JAVA (14)
      • 디자인 패턴 (4)
      • 책 읽기 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 우테코5기
  • 프로세스
  • OperatingSystem
  • 우아한테크코스5기
  • OS
  • 블랙잭
  • 우테코
  • 원시값 포장
  • Spring
  • Operating System
  • 백준
  • 운영체제
  • bean
  • 인덱스
  • 정규화
  • C
  • SIGINT
  • C++
  • 트랜잭션
  • signal
  • BOJ
  • 리눅스
  • 자바
  • 우테코 체스
  • 1259
  • DB
  • Linux
  • 우아한테크코스
  • 데이터 조작어
  • 우아한형제들

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Ocean_

꾸준한 프로그래밍

C / LINUX fork()
C & LINUX

C / LINUX fork()

2022. 5. 2. 20:14

함수 기능

기존 프로세스가 새 프로세스를 생성할 떄 사용하는 시스템호출 함수

 

자식은 부모의 자료구조, 힙 , 스택의 복사본을 가지기 때문에 동일한 메모리영역을 공유하여 사용하진않지만 텍스트 구역은 공유하여 사용한다. 일반적으로 부모와자식의 실행순서는 알수가 없다.

함수 원형

#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
    'C & LINUX' 카테고리의 다른 글
    • C / LINUX setjmp(3) longjmp(3)
    • C / LINUX vfork()
    • C / LINUX opendir(3) readdir(3) rewinddir(3) closedir(3) telldir(3) seekdir(3)
    • C / LINUX utime()
    Ocean_
    Ocean_
    dongVeloper

    티스토리툴바