본문 바로가기

SSS

SSS-3. UNIX 시스템 호출

지난시간 목차

지난 시간에는 System Call에 대해 file만 나갔다.

process 관련 System call에 대해 알아보자.

 

process : program이 수행되는 것. executable file이 memory에 로딩된 것이 process.

process control을 위한 system call을 예제 중심으로 알아봅시다.

 

목차

-fork/vfork 및 file sharing

-exit, wait, exec 계열

-user id(real/effective)

 

fork/vfork 및 file sharing

*vfork는 child process를 만들지 않고(fork -> exec 하는 경우에) parent가 연 file을 공유하는 방식? 이다.

 

int pid;
printf(“ my pid = %d\n”, getpid());
pid = fork();
if (pid > 0)    { /* parent */
	printf(“parent with pid = %d\n”, getpid());
    }
else if (pid == 0) { /* child  */
	printf(“child with pid = %d\n”, getpid());
	}
else if (pid == -1) {
	printf(“error \n”);
    }

 

더보기

결과 실행

my pid = 110

child with pid = 111

parent with pid = 110

(코드는 운체 때도 본 코드이므로 자세한 설명은 생략한다.)

이 때 parent와 child가 공유하는 내용은 다음과 같다.

text(code) - share

data - no share

stack - no share

메모리 배열에 관해 ...

각각의 부분은 다음과 같은 part로 이루어져 있다.

 

그림을 하나 더 보자(조금 더 자세히 나와있다).

fork를 썼을 때 parent와 child의 파일 공유

지금까지 배운 걸로 퀴즈를 풀어봅시다 !

 

Q. 다음 코드를 읽고 생성되는 process의 갯수는 몇개일지 맟춰봅시다.

int pid, i, N;
....
for(i=1;i<=N;i++)
	fork();
더보기
정답은 2^N개!

 

 

exit, wait, exec 계열

-exec 계열

 exec+{l,v}+{p, <sp>, e} ()

 +argument 형식 관련 : l (list), v(vector)

 +p(path), e(environment), sp(직접지정)

 

! 환경 변수

다음과 같은 요소로 이루어져 있다.

 

exec() 실행 예제를 보자.

exec 각 요소에는 뭐가 들어갈까

exec가 실행되면... 다 갈아 엎는다. 자기 process에서 날리고 불러온 program을 실행시키는 것이다.

어디를 날리는지는 OS마다 다르다. 대충 위에 있는 사진은 다 날라간다고 보면 된다.

fork는 새로 process를 복제하는 거라 다르다.

 

fork()와 exec()를 합체해보자.

응용 1.

{
     if ((pid=fork()) == 0) { /* child */
          execlp(“myprogram”,”myprogram”,”only 1 arg”,(char *)0 );
          printf(“myprogram cannot be executed. Check it. \n”);
     }
     else if (pid > 0)  /*parent */
}

fork로 만들어진 자식 process를 exec() 시켜서 독립시켜버릴 수 있다.

응용 2.

if (fork() == 0) { /*child*/
      fd = open();
      close(0);
      dup(fd)
      close(fd);
      execlp(“cmd”,”cmd”,(char *)0 );
}

*dup은 가장 앞부터 찾아서 비어있는 곳에 복사한다.

해당 코드는 결과적으로 0번이 open한 file을 가리키게 된다. = cmd < F와 같다!(redirection)

 

 

User id

(Real user/effective user)

-real user : 실제 프로그램을 실행하고 있는 사람.

-effective user : 파일 주인.

 

마찬가지로 예시를 보자.

"maury" user id 8319

"mjb" user id 5088

uid = getuid();
euid = geteuid();
fdmjb = open(“mjb”,O_RDONLY);
fdmaury = open(“maury”,O_RDONLY);
printf(“uid = %d, euid = %d, fdmjb=%d, fdmaury=%d\n”, uid, euid, fdmjb, fdmaury); 

*user mjb가 "maury"를 실행시켰을 때

uid = 5058, euid =8319, fdmjb=-1, fdmaury= 3

*user maury가 "maury"를 실행시켰을 때

uid = 8319, euid =8319, fdmjb=-1, fdmaury= 3

 

user ID별 항목은 다음과 같다.

 

saved set-user-ID에 대한 자세한 과정은 다음 그림을 참고하자.

'SSS' 카테고리의 다른 글

SSS-4. 시스템 데이터 파일  (0) 2020.04.13
SSS-1_2. UNIX 시스템 소개 및 구조  (2) 2020.04.11