min's devlog

fork()와 wait() 본문

Linux/TCP IP Socket Programming

fork()와 wait()

값진 2021. 3. 27. 11:12

프로그램 실행

프로그램이 실행되면 프로세스가 된다. 컴퓨터나 폰을 켰을 때 0번 프로세스로부터

자식프로세스를 계속 생성하게 되고 명령을 내릴 때 마다 ID로 관리

부모의 환경변수, 로컬변수 값을 그대로 상속 받게 됨. 그 과정에 관한 함수 fork()에 관한 내용

 

bash()는 parent process->child를 생성하는 함수 이름: fork()

fork()를 호출하면 return값으로 pid type(=정수값->child process id)를 리턴한다

->fork() 호출시 부모에서 자식이 생성됨

 

fork()

부모 프로세스를 똑같이 복제하여 새로운 자식 프로세스를 생성하는 함수

자식 프로세스에게는 0을 리턴하고 부모프로세스에게는 자식 프로세스 ID를 리턴한다.

 

더보기

#include <unistd.h>

pid_t fork(void)

 

fork() 실행 후, 

-만약 i=10 이 복제 되었다고 쳐보자.

근데 child process에서 i를 15로 바꾸면 서로 아무 관계가 없어진다. 별도의 존재가 된다.

-그 후 부모 프로세스와 자식 프로세스는 병행적으로 각각 실행을 계속한다.

 

pid_t getpid(void);

기능 : 이 함수를 호출하는 프로세스의 프로세스 ID를 리턴하는 함수

 

 

더보기

#include<stdio.h>

#include<unistd.h>

 

/*자식 프로세스를 생성한다.*/

int main()

{

    int pid;

    printf("[%d] 프로세스 시작 \n", getpid());    //부모프로세스가 자신의 pid를 출력한다

    pid = fork();    //fork() 사용시 리턴값pid는 자식의 pid

    printf("[%d] 프로세스 : 반환값 %d\n", getpid(), pid);    //getpid: 자신의 pid, pid:자식의pid

}

실행결과

[80] 프로세스 시작

[80] 프로세스 : 반환값81 // 두 줄 다 부모의 이야기

([81] 프로세스 : 반환값 0)

 

 

근데, 자식은 똑같은 코드(프로세스이미지)를 복제한건데, 자식인지 어떻게 알까?

->fork 이후 pid가 0이면 자식프로세스가 0이다

 

자식 프로세스 생성

더보기

#include <stdlib.h>

#include <stdio.h>

/*부모 프로세스가 자식 프로세스를 생성하고 서로 다른 메시지를 프린트*/

int main()

{
    int pid;

    pid = fork();

    if (pid ==0) { //자식 프로세스

        printf("[child] : %d\n", getpid());

    }

    else {   //부모 프로세스

        printf("[parent] : %d\n", getpid());

    }

}

 

 

wait()

더보기

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait (int *status);

-fork를 여러번 할 수 있다. 자식 프로세스를 여럿 생성할 때 특정 자식 중 하나가 종료할 때 까지 기다림

pid1 = fork();

pid2 = fork();

-가장 먼저 종료한 자식의 id 하나를 리턴(pid type)한다

-wait()를 호출한 함수의 결과값은 자식프로세스의 ID가 된다.

-자식 프로세스가 올바르게 종료되고, 종료코드가 *status에 저장이 된다.

 

더보기

#include <sys/types.h>

#include <sys/wait.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

 

/*부모 프로세스가 자식 프로세스를 생성하고 끝나기를 기다린다.*/

int main()

{

    int pid, child, status;

 

    printf("[%d] 부모프로세스 시작\n",getpid());

    pid = fork();

    if(pid==0){

        printf("[%d] 자식프로세스 시작,(pid=%d)\n",getpid(),pid);

        exit(1);

    }

 

    child=wait(&status); //자식프로세스가 끝나길기다림 //wait의 리턴값인 child(child프로세스아이디)

    printf("[%d] 자식프로세스 %d종료\n",getpid(),child);

    printf("\t종료코드 %d\n", status>>8);        //shift

}

실행 결과

[1117] 부모프로세스 시작

[1118] 자식프로세스 시작, (pid=0)

[1117] 자식프로세스 1118종료              //[1117] 자식프로세스 인 듯 하다.

     종료코드 1

 

 

헷갈릴때 구분법

getpid는 id출력

pid는 리턴값

 

평소 getpid는 부모의 id만 나오고

자식의 id는

1. 따로 wait써서 child에 저장하거나

2.if pid==0 이라는 전제 후 getpid 해줄 때만 나오는 듯 하다

 

 

 

'Linux > TCP IP Socket Programming' 카테고리의 다른 글

소켓 옵션 종류(2)  (0) 2021.03.28
소켓옵션 종류  (0) 2021.03.27
소켓과 소켓 옵션  (0) 2021.03.27
어셈블된 코드  (0) 2021.03.26
메모리 영역과 변수  (0) 2021.03.26
Comments