록키의 No Pain, No Gain

[Linux]Process 본문

리눅스

[Linux]Process

Rohki 2020. 4. 21. 00:18
반응형
프로세스란?

현재 메모리상에 실행되고 있는 프로그램
프로세스는 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)

https://www.geeksforgeeks.org/process-table-and-process-control-block-pcb/

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

  •  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로 지정한 자식 프로세스의 종료만 처리해줌.

반응형
Comments