min's devlog
fork()와 wait() 본문
프로그램 실행
프로그램이 실행되면 프로세스가 된다. 컴퓨터나 폰을 켰을 때 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 |