티스토리 뷰

Server/Linux

[Linux] 프로세스

annajinee 2017. 7. 10. 17:31

*프로세스 생성, 종료와 관련된 시스템 호출/표준라이브러리 함수 목록
fork : 자신과 완전히 동일한 프로세스를 생성함
exec계열 : 지정한 실행 파일로부터 프로세스를 생성한다.
exit : 종료에 따른 상태 값을 부모에게 전달하며 프로세스를 종료한다.
atexit : exit로 프로세스를 종료할 때 수행할 함수를 등록한다.
 _exit : atexit로 등록한 함수를 호출하지 않고 프로세스를 종료한다.


* fork
fork를 호출한 프로세스를 복제하여 완전히 동일한 프로세스를 생성한다.



사용예 :
#include<sys/types.h> // types.h는 pid_t를 정의하고 있다.
#include<unistd.h>    // fork프로토타입이 정의되어 있다.

프로세스는 한 instance를 의미한다. 실행파일을 실행시키면 파일 형태로 저장되어 있는 프로그램 코드가 메모리로 로드되어 프로그램 코드의 첫번째 명령부터 실행된다. 
-> 실행파일파일을 실행하기 위해 메모리로 로드된 상태를 프로세스라 한다.

자식 프로세스가 만들어 진 이후에 부모프로세스와 자식 프로세스는 동시에 나머지 프로그램 코드를 수행하며 
이때 이후로는 부모프로세스와 자식 프로세스 사이에 어떠한 관계도 생기지 않는다.
fork를 호출한 후 그 반환 값으로 자식과 부모를 구분한다.
부모 <-자식프로세스 식별번호 반환
자식<-0반환 (자식프로세스가 없기 때문



* exec 계열
: 경로명이나 파일명으로 지정한 실행파일을 실행하여 프로세스를 생성한다.
#include<unistd.h> : exec 계열의 프로토 타입이 정의 되어 있다.
exec계열의 함수는 지정한 파일을 실행하여 새로운 프로세스를 생성한다.
이는 셸의 프롬프트 상태에서 실행파일을 실행하는 것과 같은 방법으로 지정한 파일을 실행한다.
fork는 동시에 존재하면서 fork이후의 나머지 코드를 부모와 자식이 실행
exe계열의 함수는 지정한 파일로 프로세스를 만든 후 성공하게 되면, 호출 프로세스는 종료하고 피호출 프로세스는 처음부터 시작
호출 프로세스가 메모리에서 제거 되면서 비게 되는 자리를 피호출 프로세스가 차지->호출프로세스의 식별자를 피호출 프로세스가 물려받게 됨



**자신과 다른 프로세스를 생성하면서 자신도 살아남으려면?
pork로 자식프로세스를 생성한 수 자식 프로세스가 exec로 새로운 프로세스를 생성한 후 종료한다.



*exit

현재 프로세스를 종료시키면서 부모 프로세스에게 종료와 관련된 상태 값으 ㄹ넘겨 준다.
<stdlib.h> : exit의 프로토 타입이 정의되어 있다.
status: 부모 프로세스에게 전달되는 상태 값으로 0~255(1바이트)의 사용된다.
반환값: 없다.
: exit는 프로그램을 의도적으로 종료시키기 위한 함수로 인자는 보통 종료 상태와 관련된 의미를 가지는 값으로 사용한다.

자식프로세스가 종료하면서 전달하는 종료 상태 값을 부모 프로세스는 wait함수를 사용하여 확인 할 수 있다.



*atexit
:프로세스가 exit호출로 종료할 때 수행되는 함수들을 등록한다. or main함수 내에서 return문을 호출하여 종료될 때 호출됨
unistd.h : atxite의 프로토 타입이 정의되어 있다.



사용예)
#include<stdlib.h>
int atexit(void (*function)(void));
인자: function :atexit로 등록할 함수이다.
반환 값: 호출이 성공하면 0을 반환 하고, 실패하면 0 이 아닌 값을 반환한다.
->주로 clean-up-action시 사용 (종료 시 마무리 작업)
ex) 개방한 파일에 대한 쓰기 작업을 마저하거나 자식 프로세스를 강제로 종료 시키는 일 등..

<<<시스템 호출/표준 라이브러리 함수>>>-환경변수 전달
wait ) 자신의 자식프로세스가 종료할 때까지 대기 상태가 되낟.
waitpid ) 지정한 자신의 자식 프로세스가 종료 할 때까지 대기 상태가 된다.
getpid ) 자신의 프로세스 식별 번호를 구한다.
getppid ) 부모 프로세스의 식별 번호를 구한다.
getgrp )자신의 프로세스 그룹 식별 번호를 구한다.
setgrp ) 자신의 프로세스 그룹 식별 번호를 변경한다.
getpgid ) 지정한 프로세스의 그룹 식별 번호를 변경한다.
getenv ) 환경변수의 값을 구한다.
putenv )새로운 환경 변수를 등록하거나 변경한다.
setenv ) 새로운 환경변수를 등록하거나 변경한다.
unsetenv ) 등록된 환경변수를 삭제 한다.

-하나의 프로세스가 새로운 프로세세르르 생성하여 동시에 수행 될 때 각각이 종료되는 순서는 수행해야 하는 작업에 따라서 어떤 순서가 될 지 장담 할 수 없다.



* wait
: 자신의 자식 프로세스가 종료 할 때까지 대기 한다.
status: 자식 프로세스가 exit 함수로 종료하면서 전달하는 종료 상태 값으로 0에서 255 사이의 값을 가진다
반환값 : 호출이 성공했을 경우 종료한 자식 프로세스의 식별번호가 반환되고, 실패 했을경우 -1이 반환 된다.
헤더파일 
types.h : pid_t가 정의되어 있다.
wait.h : wait의 프로토타입이 정의되어 있다.



-자식프로세스가 종료되었을때, 부모 프로세스가 wait를 호출하여 종료를 처리해주지 않으면 자식 프로세스는 좀비 프로세스(Zombi Process)가 된다. 
좀비프로세스 : 프로세스가 종료하였지만 부모 프로세스가 종료를 처리 해 주지 않아 시스템 커널의 작업 리스트에 남아 있는 상태
-> 부모 프로세스는 생성한 자식 프로세스의 수만큼 wait 함수를 호출해서 자식 프로세스의 종료를 처리 해 줘야 한다.
자식은 exit를 호출하여 종료할 때 종료 상태 값을 부모에게 전달하게 되는데 int형으로 전달하지만 실제로는 하위 1바이트 값만이 부모 프로세스에게 전달 된다.->int형 변수의 하위 두번 째 바이트에 저장된다.



*waitpid
: 프로세스 식별번호로 지정한 자식 프로세스가 종료할 때가지 대기한다.
예)
pid_t waitpid(pid_t pid, int *status, int option);
pid: 자식 pid
status : 자식process가 exit함수로 종료하면서 전달하는 종료 상태값
option : 부모 프로세스의 대기 방법을 선택, 일반적으로 0이 사용
반환값 : 호출이 성공했을 때 종료한 자식 프로세스가 있다면 자식 프로세스의 식별 번호가 반환되고, 
WNOHANG옵션을 사용할 때 종료한 자식 프로세스가 없으면 0을 반환한다. 호출이 실패 할 경우 -1을 반환한다. 
헤더파일
:types.h : pid_t가 정의되어 있다.
: wait..h : waitpid의 프로토타입이 정의되어 있다.


-첫번째 인자인 pid로 자식프로세스의 식별번호를 사용하여 자식 프로세스의 실제 종료 순서에 상관 없이 "종료처리순서"를 임의로 결정 할 수 있다.
-waitpid의 첫번째 인자 값으로 0을 사용하게 되면 아무 자식 프로세스라도 상관없다 의미 (wait와 똑같이 동작하게 됨)

'Server > Linux' 카테고리의 다른 글

[Linux] ssh 접속  (0) 2017.07.10
[Linux] waitpid예제-WNOGANG옵션  (0) 2017.07.10
[Linux] waitpid 예제  (0) 2017.07.10
[Linux] 프로세스간 통신  (0) 2017.07.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함