일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웅덩이 매매법
- 평균급여액
- 역행자
- 행크TV
- 황농문 서울대교수
- 부동산 기사읽기
- 경제 기사읽기
- 한국직업개발원
- 유전자오작동
- 이중통화채(dual currency bond)
- 정체성 만들기
- 백준 1238
- 자발적 실업
- 엥겔의법칙
- 월부TV
- 부동산기사읽기
- 원금리스크
- 자의식 해체
- 매일경제
- 제로금리정책
- 급여액
- 경제금융용어
- 백준 파티
- 경제적 자유를 위한 5가지 공부법
- 업무지구별
- 구해줘월부
- 특수목적기구
- 연방준비제도(FRS)/연방준비은행(FRB)
- KFO
- 경제기사 읽기
- Today
- Total
록키의 No Pain, No Gain
[Linux]Process 본문
프로세스란?
현재 메모리상에 실행되고 있는 프로그램
프로세스는 Non-RTOS에서는 Task가 프로세스로, RTOS에서는 Thread로 된다.
실행에 필요한 메모리 영역(TEXT, DATA, BSS, STACK)이 독립적으로 할당
스레드
실행에 필요한 각 메모리 영역들을 다른 태스크와 공유(Stack 제외)
프로세스 생성 호출
함수 | 의미 |
fork() | 자신과 완전히 동일한 프로세스를 생성한다. (메모리 공간을 똑같이 복사) |
exec() 계열 | 지정한 실행 파일로부터 프로세스를 생성한다. |
exit() | 종료에 따른 상태 값을 부모 프로세스에게 전달하며 프로세스를 종료한다. (library - 표준 입출력 정리하고 종료) |
atexit | exit로 프로세스를 종료할 때 수행할 함수를 등록한다. |
_exit | atexit로 등록한 함수를 호출하지 않고 프로세스를 종료한다. (System call 표준입출력 정리하지 않고 종료) |
fork()
fork()를 호출한 프로세스를 부모 프로세스라고 부르고 새로 생성된 프로세스를 자식 프로세스라고 부른다.
- 부모 프로세스와 자식 프로세스는 PID가 서로 다르다
- 프로세스 식별 번호(PPID)는 자신을 생성한 부모 프로세스가 된다.
fork()를 호출 다음부터 부모와 자식 프로세스가 동시에 수행
자식 프로세스는 부모 프로세스 시점의 상태를 그대로 물려받는다.
- PCB(Process Control Block)
프로세스를 복제하여 완전히 동일한 프로세스를 생성한다.
- fork()를 사용하면 실행 중인 프로세스를 복제하여 새로운 프로세스를 생성할 수 있다.
pid_t fork(void):
return: 부모 - 자식의 PID
자식은 - 0
실패시 - (-1)
exec() 계열
경로 이름 or 파일 이름으로 지정한 실행 파일을 실행하여 프로세스 생성한다.
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
Caller / Callee Process
- callar process : exec를 실행하는 프로세스
- callee process : exec에 의해 생성되는 프로세스
exec를 성공적으로 호출한 결과
- caller process는 종료된다.
- caller process의 메모리 영역을 callee process가 차지
- caller process의 PID를 callee process가 물려받는다.
다음 중 성격이 다른 API는 무엇인가? 문제 나오기 딱좋다.
두개의 프로세스간에 값을 전달하고 싶다. 이럴 때 환경변수를 사용해서 가능하다.
exit()
void exit(int status)
- status : 부모 프로세스에게 전달되는 상태 값, 임의의 0 ~ 255(1 Byte)의 값
프로세스 종료:
- exit는 프로세스를 의도적으로 종료시킨다.
- main 함수 내에서 return문을 수행할 때
atexit()
프로세스가 exit을 호출하여 종료할 때 수행되는 함수 등록.
#include <stdlib.h>
int atexit(void (*function)(void));
function : 사용할 함수 이름
return : 호출이 성공하면 0 반환, 실패하면 0이 아닌 값을 반환.
_exit()
exit 함수와 같지만 clean-up-action을 수행하지 않는다.
getpid()
getenv(), putenv(), setenv()....
#include <stdlib.h>
char *getenv(const char *name);
int putenv(char *string);
int setenv(cont char *name, const char *value, int overwrite); // overwrite == 0 덮어쓰기, != 덮어쓰기 X
void unsetenv(const char *name);
return getenv() 실패할 경우 NULL 반환
putenv와 setenv 성공할 경우 0, 실패할 경우 -1 반환.
환경변수 전달
getpgrp(), getpgid()
프로세스의 그룹 식별 번호를 구하거나 변경한다.
#include <sys/types.h>
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
int setpgrp(void);
pid_t getpgrp(void);
return: setpgid(), setpgrp() 호출 성공시 0, 실패 -1
getpgid(), getpgrp() 호출 성공시 gid, 실패 -1,
getsid(), setsid()
프로세스의 세션 식별 번호를 구하거나, 새로운 세션을 생성한다.
#include <sys/types.h>
#include <unistd.h>
pid_t getsid(pid_t pid);
pid_t setsid(void);
return : 호출 성공 sid, 실패 -1
- 세션 > 그룹 > 프로세스
- 세선의 리더 : 자신의 PID = PGID = PSID
-> 세션 리더가 죽으면 세션 안에 있는 애들 다 죽는다.
비정상 상태에 따른 분류
좀비 프로세스
waitpid()
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options
options : 부모프로세스 대기방법. 보통 0
return : 성공시 자식 pid, 실패시 -1, WNOHANG 옵션시 0.
wait와 waitpid의 차이점
- wait은 자식프로세스중 가장 먼저 종료되는 것을 처리해줌
- waitpid는 PID로 지정한 자식 프로세스의 종료만 처리해줌.