Process Attributes

프로세스들은 프로세스를 확인하고 동작을 정의하는 특성들을 가지고 있습니다. 커널은 각각의 프로세스들이 내부적으로 가지고 있는 정보를 유지하고, 그 정보를 얻기 위한 인터페이스나 function call 그룹을 제공합니다. 이 섹션에서는 이러한 정보가 어떤 정보인지, 또한 이 정보를 얻고 다루기 위한 인터페이스에 대해 알아봅니다.

Process Identifiers

프로세스의 기본적인 특성은 프로세스 ID인 PID와 부모의 process ID인 PPID입니다. 

PID와 PPID 모두 0이 아닌 양수입니다. 

PID는 프로세스를 유일하게 특정합니다.(하나의 PID는 하나의 프로세스만 매칭됩니다.) 

프로세스가 새로운 프로세스를 만든다면 child process를 생성한 것입니다. 반대로 child process를 만든 프로세스는 parent process입니다.


모든 프로세스들은 따라가다 보면 init process(pid = 1)의 손자들입니다.

init process는 커널이 부팅된 후 최초의 프로세스입니다.

<unistd.h>에 정의되어 있는 getpid, getppid 함수를 이용해 pid와 ppid값을 얻을 수 있습니다.

이 두 함수의 원형은 다음과 같습니다.


pid_t getpid(void);

pid_t getppid(void);


getpid는 호출한 프로세스의 pid를 반환해 줍니다. 

getppid는 호출한 프로세스의 부모 프로세스 pid를 반환해 줍니다.


-prpids.c-

Real and Effective IDs

각각의 프로세스는 PID와 PPID뿐만 아니라 몇가지 다른 identifying attributes를 가지고 있습니다.
아래 표의 함수를 사용하기 위해서는 <sys/types.h>와 <unistd.h>를 include해야 합니다.

 Attribute

Type

Function 

Process ID

pid_t

getpid(void); 

Parent Process ID

pid_t 

getppid(void); 

Real User ID

uid_t

getuid(void);

Effective User ID

uid_t

geteuid(void); 

Real Group ID

gid_t

getgid(void); 

Effective Group ID

gid_t 

getegid(void); 


각각의 프로세스는 3개의 user ID(UIDs)와 3개의 group ID(GIDs)를 가지고 있습니다. 이것들은 파일 접근 허가나 누가 특정한 프로그램을 실행할 수 있는지와 같은 보안 목적으로 사용되어집니다.

real user ID와 real group ID는 진짜 사용자가 누구인지 알려줍니다. 이것들은 로그인 시 /etx/passwd에서 읽어옵니다. 

Effective user ID와 Effective group ID는 보안적인 목적으로 사용하지만 대부분의 경우 real user ID와 real group ID와 일치합니다.

real과 effective의 차이는 다음 섹션에서 다룰 주제인 setuid나 setgid와 관련이 있습니다.


-ids.c-


setuid and setgid programs

프로세스의 read ID와 effective ID가 다른 경우는 프로그램이 setuid나 setuid를 사용할 때 발생합니다. 

setuid와 setgid는 사용자에게 프로그램을 실행할 때 특별한 권한을 주기 위해서 사용합니다.

예를 들어 비밀번호를 바꾸기 위해 사용하는 passwd 프로그램을 생각해 봅시다. 이 file은 모든 유저들이 읽을 수 있지만 root user만이 writable해야 합니다.


User Information

기계들은 숫자로 잘 구별할 수 있지만, 사람은 이름으로 구별하는게 훨씬 편합니다. 다행히 UID를 사람이 읽을 수 있는 이름으로 바꿀 수 있는 2가지 방법이 있습니다. getlogin 함수는 프로세스를 실행하는 유저의 login name을 반환합니다. 

getlogin은 <unistd.h>에 선언되어 있습니다. 원형은

char *getlogin(void); 

입니다.


-getname.c-


Additional Process Information

프로세스, 유저, 그룹 ID 이외에 resource usage와 execution times와 같은 정보를 얻을 수도 있습니다. 여기서 excution time's'로 쓴 것에 유의하세요. 이렇게 쓴 이유는 리눅스 커널이 프로세스의 time value를 아래와 같이 3가지로 분리해 가지고 있기 때문입니다.
  • Wall clock Time (Elapsed time)
  • User CPU time (user mode(non-kernel mode) 코드를 실행하는데 프로세서가 사용한 총 시간)
  • System CPU time (kernel 코드를 실행하는데 사용한 시간)
이러한 정보는 times나 getrusage를 호출해서 얻을 수 있습니다.
프로세스의 리소스 사용은 getrusage를 호출해서만 얻을 수 있습니다.
이러한 리소스들은 모두 메모리 접근 통계와 관련이 있습니다. 

times function의 원형은 <sys/times.h>에 정의되어 있습니다.

clock_t times(struct tms *buf);

times는 시스템이 동작하고 얼마나 clock tick이 지났는지를 반환해줍니다. 

-resusg1.c-

-resusg2.c-



Posted by 몰랑&봉봉
,