개발👩‍💻/시스템프로그래밍

프로세스 다루기 1(11-1)

gigibean 2021. 6. 6. 02:34
728x90

uid 라는 것이 real uid, effective uid 로 나뉘어진다.

real uid는 로그인할 때 정해진다. 사용자가 로그인해 프로세스를 생성하면 프로세스 real uid는 그 사용자가 된다. 그리고 이 사용자는 super user일 경우에만 변경이 가능하다. root 일 경우를 제외한 다른 유저일 경우 프로세스의 real uid를 변경 할 수 없다.

 

effective uid는 파일의 접근 권한 따질때 사용한다.

접근 권한을 그냥 주는 것이 아니라 3개의 그룹으로 나눠 준다.

파일의 onwer, group, other 각각의 사용자 그룹이다.

파일의 onwer가 있다면, 그 사용자에게 접근권한이 주어진다.

프로세스의 real uid, effective uid 두개 유저 id 가 있는데,

ㄱeal 이 ko, effective 도 ko라고 한다면

프로세스에서 해당 파일을 열려고 할때 접근권할을 볼 때 effective = real 일 경우 onwer의 주어진 권한을 보고 파일을 열 수 있는지 없는지 확인할 수 있다.

근데 어떤 이유에서 두개가 다르다면 예를들어 effective가 kim이라고 하면, 해당 파일을 읽기 위해서 이 파일을 열려고 할 때 읽을 수 있을까?

파일의 접근 권한 따질 때 real이 아닌 effective를 비교하게 되고, 그렇기 때문에 onwer가 ko로 설정되어있는 파일에 effective ko로 접근할 수 없다.

 그 다음에 group을 확인하는데, ko와 kim이 같은 그룹이라면 group을 적용시키고, 같은 그룹이 아니라면 other를 적용시킬 것이다.

파일의 접근 권한 따질 때 두가지 유저 id 중 effective 가지고 따진다.

effective는 real과 같은 수도 있고 다를 수도 있다.

effective는 그렇담 언제 결정되냐면 exec할 때 결정된다.

shell 프로세스가 있고 shell에서 a.out 프로그램을 실행시켰다면 포크에 의해서 자식 프로세스를 실행시킨다.

자식 프로세스는 부모와 같다. 따라서 쉘 프로세스의 real, effective 둘다 ko라고 할때, 해당 속성을 자식도 물려받아 real, effective모두 ko가 된다.

그리고 이어서 exec을 했을 때 자식 프로세스가 shell -> 다른 프로그램이 돌아가게 된다. effective 가 유지될 수도, 바뀔 수도 있다. 

 

실행하는 프로그램의 접근 권한이 r-xr-xr-x 이렇게 되어있다고 되어 있다면

Set-user-ID bit가 off된 경우 effective = real, 변경되지 않는다.

그러나 Set-user-ID가 on인 경우 바뀌는데, effective uid는 실행 파일의 onwer로 바뀌게 된다.

접근 권한, 프로그램 오너가 kim으로 되어 있다면 이 파일을 실행시켰을 때 실행하기 위해 자식프로세스가 exec할때 

해당 오너 접근 권한이 x로 되어있는 경우 effective user id가 exec을 하고 나서도 변동이 없이 유지가 된다. 즉 해당 파일 접근권한에서 오너에 해당하는 접근 권한 중 x가 주어져 있으면 set-user-id bit가 off되어 있는 것과 같다

set-user-id bit가on 되어 있는 것은 onwer 의 x자리가 S로 되어 있다 rwS 이렇게. 이런 파일을 실행시키게 되면 effective uid는 실행파일의 onwer와 같다. 

 

exit

프로세스 종료하면서 부모 프로세스에게 종료와 관련된 상태값을 넘겨준다.

의도적으로 프로세스 종료시키고자 할 때 exit 인자로 임의의 값을 주는데, 이 값을 exit status 라고한다.

0~255 사이의 값이다.

종료하는 지점마다 다른 값을 부여해서 구별할 수 있도록 임의로 설정할 수 있다.

 

종료를 하고 어느 지점에서 종료되었는지 구별할 수 있고, 이 값을 부모에게 전달해주는 용도로 사용된다.

 

 

쉘에서 프로그램을 실행시키고 확인하는 방법

csh의 경우, $ echo $status 로 확인 할 수 있다.

bash의 경우 $ echo $? 로 확인할 수 있다.

 

부호없는 숫자를 사용하기 때문에 -1을 exit인자에 넣고 status를 확인하면 255가 나온다.

쉘 스크립트 실행 명령어 csh + 쉘 스크립트 이름 or bash+이름

 

atexit

프로세스가 종료될 때 수행할 함수를 등록

int atexit(void (*function)(void))

인자는 함수 포인터 변수

호출에 성공하면 0을 반환, 실패시 0아닌 값 반환

함수의 주소를 받아 등록한다.

등록 시 등록된 함수가 호출되는데 exit될 때 호출된다.

호출 순서가 등록순서의 역순이다.

 

atexit(func1)

atexit(func2)

 

이렇게 순서대로 보냈으면 반대로 2, 1 순으로 자동 호출된다.

 

_exit는 atexit이 호출되지 않고 그냥 종료된다.

 

반응형