지난 글에 이어서 이번 글에서는 프로세스를 식별하고 환경변수 설정하는 방법에 대해 말씀드릴게요!
1.PID
우리가 작업 관리자를 실행하면, 많은 항목 중에 PID라는 항목을 볼 수 있어요.
저번 글에 있던 터미널 화면에서도 확인해 볼 수 있는데요.
PID는 Process ID의 약자로써, 말 그대로 각 프로세스를 식별하는 번호(ID)예요.
이런 PID는 0번부터 시작하는데, 0번째 프로세스는 한 번쯤 들어보셨을 법한 스케줄러예요. 이 스케줄러는 커널의 일부분에 속해 있어서 별도의 실행파일이 없어요. 또한 1번째 프로세스도 특별한 프로세스인데 이를 소개하기 전에 먼저 프로세스의
계층구조에 대해 알아볼게요.
1.1. 계층구조
프로세스 역시 계층구조를 지니고 있어요. 계층구조는 쉽게 말해, 부모 - 자식 관계인 구조를 말해요. 예를 들어 임의의 프로세스에서 새 프로세스가 생성되면, 그 프로세스는 실행 중이던 프로세스의 자식 프로세스가 된다고 말할 수 있어요.
여기서 1번 프로세스가 지니는 의미는 바로 최상위(root) 프로세스라는 것이에요. 그 말은, 모든 프로세스의 시초라고도 할 수 있고, 그래서 1번 프로세스를 init(initialize의 약자)이라고도 불러요.
1.2. PID 검색하기
이제 PID를 검색하는 방법에 대해 알아볼게요. 리눅스 환경에서 getpid() 함수를 사용하면 PID를 검색할 수 있어요.
이 함수를 실행하게 되면, 이 함수를 호출한 프로세스의 PID를 리턴해줘요.
그리고 0번 프로세스를 제외한 모든 프로세스는 자신을 생성한 프로세스 즉, 부모 프로세스가 있어요. 이러한 부모 프로세스 역시 getppid()를 사용해서 알아볼 수 있어요.
이렇게 위 예시처럼 간단하게 PID를 확인할 수 있어요.
2. 프로세스 그룹
프로세스는 그룹으로도 존재하는데, 이 그룹에도 ID가 적용돼요. 그런 ID를 PGID라고 합니다.
이런 PGID는 해당 그룹 내에 존재하는 프로세스들 중 하나가 그룹의 리더가 되면서 그 그룹 리더의 PID가 그 그룹의 PGID가 되는 방식을 가져요. 물론 리더는 변경될 수 있고, 그럼 당연히 PGID도 바뀌겠죠?
2.1. PGID 검색하기
PGID 검색하는 함수는 크게 두 가지가 있어요.
- getpgrp(): getpid()처럼 이 함수를 호출하는 프로세스가 속한 그룹의 PGID를 리턴
- getpgid(): PID를 인자로 받고, 해당 인자가 속한 그룹의 PGID를 리턴
아래는 getpgid() 예시입니다.
3. 세션(session)
프로세스 그룹이 연관된 프로세스를 그룹으로 묶은 거라면, 세션은 그런 프로세스 그룹들을 터미널 단위로 묶은 것을 말해요.
이런 세션도 ID를 가지는데, 이 ID는 어떤 ID일까요?
프로세스 그룹과 비슷하게 세션 ID는 여러 프로세스 그룹의 리더 프로세스들 중 리더 프로세스의 ID를 가져요.
이 세션 ID를 검색할 때는, setgid()를 사용하면 되는데, 이 setgid() 함수도 PID를 인자로 받아요.
위 예시에서 함수만 바꿔주면 되기 때문에 예시는 생략할게요!
4. 환경변수
프로세스가 실행될 때, 실행이 되는 기본 환경이 있는데요. 이 환경에는 사용자의 로그인명, 셸, 언어, 경로명 등을 포함해요.
그래서 이 환경 내에서 프로세스가 실행되는 동안, 모든 프로세스는 부모 프로세스에서 기본 환경을 물려받게 돼요.
4.1. 환경 변수란?
위에서 설명했던 기본 환경은 환경 변수로 정의되어 있어요. 이러한 환경 변수는 '환경 변수명 = 값' 형태로 구성되고, 이때
환경 변수명은 관례적으로 대문자로 사용합니다.
그래서 리눅스에서 현재 셸의 환경 설정을 확인해 볼 수 있는데 이때 사용하는 명령어가 'env'입니다.
env를 사용하면, 셸의 종류, 현재 디렉터리의 위치, 로그인 ID 등 여러 정보를 확인해 볼 수 있어요.
4.2. 환경 변수 활용
이제 환경 변수를 활용해 볼게요.
4.2.1. 전역 변수 사용: environ
이 environ 변수는 환경 변수 전체에 대한 포인터로, 이를 사용해서 환경 변수를 검색할 수 있어요.
아래 예시로 확인해 볼게요.
이렇게 전역 변수 environ을 임시 포인터인 env에 저장해 사용할 수 있어요.
4.2.2. main() 함수 인자 사용
이 방법은 위 방법과 거의 유사해요. 다만 다른 점은 위에서는 환경 변수를 extern으로 지정했다면, 여기서는 main() 함수의 인자로 환경 변수에 대한 포인터를 받는다는 점이에요.
main() 함수에 인자를 넣으려면 아래 예시처럼 하시면 돼요.
4.2.3. 환경 변수 검색
환경 변수를 검색하기 위해서는 getenv() 함수를 사용할 수 있어요.
getenv(): 인자로 설정한 환경 변수가 설정되어 있는지 검색해 주소값을 리턴
4.2.4. 환경 변수 값 변경
기존의 환경 변수의 값을 변경하는 함수는 setenv() 함수예요.
사실 비슷한 함수로 putenv()가 있는데, putenv() 함수는 기존의 환경 변수 값을 변경하는 용도보다는, 새로운 환경변수를 설정할 때 사용한다고 교수님께서 말씀해 주셨어요.
사용방식은 동일하게 인자에 '환경변수=값'을 넣어주면 돼요.
4.2.5. 삭제
마지막으로 환경변수의 설정을 삭제하고 싶을 때는 unsetenv() 함수를 사용하고, 인자에 삭제할 변수명을 넣어주면 돼요.
이렇게 프로세스 정보에 대한 기본적인 설명이 끝났네요.
다음 글에서는 새로운 내용으로 뵐게요👐
'시스템 프로그래밍' 카테고리의 다른 글
프로세스 정보(리눅스) - 1 (0) | 2024.11.23 |
---|