[리눅스] 시스템 프로그래밍 - 프로세스
프로세스
리눅스에서 프로그램이 실행되는 과정
사용자가 프로그램을 쉘 프롬프트에서 지정하여 실행 : 내부적으로 현재 실행 중인 프로그램(shell) 내에서 fork() & exec() 시스템 호출을 통해 새로운 프로그램이 실행됨
C 시작 루틴 : 컴파일러가 실행 파일에 C 시작 루틴을 포함 시킴. 이 루틴은 exec로부터 전달받은 명령줄 인수, 환경 변수를 main 함수로 전달하는 역할을 수행함
프로그램 실행 종료
Main 함수의 실행이 끝나면 exit( main (argc, argv) )를 호출
C 시작 루틴은 프로그램의 실행이 끝나면 main 함수로 부터 반환 값을 받아 exit 한다.
정상 종료 :
Main 함수 return 0 -> C 시작 루틴이 Exit(0) 을 호출 -> 커널 수행 - > scheduling -> Shell로 복귀
비정상 종료 : abort() 시스템 호출을 통한 종료
커널이 프로세스에 SIGABRT 시그널을 보내어 해당 프로세스를 비정상적으로 종료 시킴
발생 이유는 잘못된 메모리 영역 참조, 잘못된 권한 설정 등이 있다.
exit()
모든 열려진 스트림을 닫고 (fclose), 출력 버퍼의 내용을 디스크에 쓰고 난 (fflush) 후 프로세스를 정상적으로 종료
종료되는 프로세스의 종료 코드가 status에 저장
종료 코드를 부모 프로세스에게 전달한다.
_exit()
뒷정리를 하지않고 프로세스를 즉시 종료시킨다.
atexit()
exit 처리기를 등록한다. 기본적인 exit() 함수의 일 이외에 추가적으로 사용자가 원하는 후처리 작업을 프로세스당 32개 까지 등록 가능
프로그램 종료 시 추가 작업으로 등록한 exit handler를 등록된 역순으로 호출 후 원래 역할인 fclose, fflush 작업 수행
명령줄 인수, 환경 변수
int main(int argc, char *argv[]);
argc : 명령줄 인수의 개수
argv [] : 명령줄 인수 리스트를 나타내는 포인터 배열
쉘이 가지고 있던 환경 변수를 쉘이 새로운 프로그램을 실행시킬 때, 실행되는 그 프로그램에게 넘겨준다
프로세스 ID
각 프로세스는 프로세스를 구별하는 번호인 프로세스 ID를 갖는다. 각 프로세스는 자신을 생성해준 부모 프로세스가 있다.
int getpid();
//프로세스의 ID를 리턴
int getppid();
//부모 프로세스의 ID를 리턴
프로세스는 프로세스 ID 이외에 그 프로세스를 실행시킨 사용자 ID와 사용자의그룹 ID를 갖는다.
프로세스 사용자 ID와 그룹 ID는 다시
실제 사용자 (or 그룹) ID
유효 사용자 (or 그룹) ID 로 구분된다.
프로세스의 사용자 ID
프로세스의 실제 사용자 ID
그 프로세스를 실행한 원래 사용자의 사용자 ID로 설정된다.
ex) A라는 사용자 ID로 로그인하여 어떤 프로그램을 실행 시키면 그 프로세스의 실제 사용자 ID는 A가 된다.
프로세스의 유효 사용자 ID
현재 유효한 사용자 ID로 새로 파일을 만들 때 그 파일의 소유자 결정시 사용되거나, 파일에 대한 접근 권한을 검사할 때 주로 사용된다.
프로세스의 사용자 ID 확인
#include <sys/types.h>
#include <unistd.h>
uid_t getuid();
//프로세스의 실제 사용자 ID를 반환
uid_t geteuid();
//프로세스의 유효 사용자 ID를 반환
uid_t getgid();
//프로세스의 실제 그룹 ID를 반환
uid_t getegid();
//프로세스의 유효 그룹 ID를 반환
프로세스 구조
프로세스는 실행중인 프로그램이다. 프로그램 실행을 위해서는 프로그램의 코드, 데이터, 스택, 힙영역 등이 필요하다.
프로그램 자체가 프로세스는 아님.
코드 : 프로세스가 실행하는 실행 코드를 저장하는 역할
데이터 : 전역 변수 및 정적 변수를 위한 메모리 영역. 초기화 되지 않은 데이터를 저장하는 영역을 구분하여 bss 영역이라 함
힙 : 동적 메모리 할당을 위한 영역. malloc 함수를 호출하면 이 영역에서 동적으로 메모리를 할당 해 줌
스택 : 함수 호출을 구현하기 위한 실행 시간 스택을 위한 영역. 활성 레코드가 저장되며 지역 변수, 매개 변수, 리턴 주소, 반환 값 저장
U-영역 : 열린 파일 디스크립터, 현재 작업 디렉토리 등과 같은 프로세스의 정보를 저장하는 영역. 프로세스의 실행을 위해 운영체제가 필요로 하는 자료 가운데 swap out 가능한 정보들. struct proc, struct user 등의 자료가 저장되는 커널 내의 영역