지난 시간에는 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로 이루어져 있다.
그림을 하나 더 보자(조금 더 자세히 나와있다).
지금까지 배운 걸로 퀴즈를 풀어봅시다 !
Q. 다음 코드를 읽고 생성되는 process의 갯수는 몇개일지 맟춰봅시다.
int pid, i, N;
....
for(i=1;i<=N;i++)
fork();
exit, wait, exec 계열
-exec 계열
exec+{l,v}+{p, <sp>, e} ()
+argument 형식 관련 : l (list), v(vector)
+p(path), e(environment), sp(직접지정)
! 환경 변수
다음과 같은 요소로 이루어져 있다.
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 |