로그인 -> 사용자를 위한 shell process를 만들어준다.
-> 프롬프트가 뜬다. ( I'm ready ! )
-> command 작성 ( 실행파일명을 쓴다 )
ex) prompt> sort.0
* 파일시스템은 tree 형태이다. 유닉스는 1970년대에 만들어졌다. 그래서 모든 용어는 1970년대 이전에 쓰던 것이다.
core dump 는 메인메모리의 문제가 있다는 뜻이다.
* command interpreter란?
프로그램을 실행하기 위해 shell (child process) 를 만드는 것
* 유닉스에서 모든 system call은 리턴값이 있어 음수면 실패라는 의미이다.
command 뒤에 ' & ' 가 있으면 emper == 1 -> 백그라운드 실행
없으면 emper == 0 -> wait
if ( fork() == 0 )
{
자식 프로세스
}
else
{
부모 프로세스
}
@ 리다이렉션 (redirection) 이란?
(input)
process -> File (프로세스가 실행할 때 필요한 입력을 제공하거나 출력을 받는 것을 File이라고 한다.)
<- ex) 터미널,
(output)
@ 파일 디스크립터 (File descriptor)
create -> 파일을 만듬
open -> 파일을 사용하게 해달라고 요청
read => fd = open() , fd를 파라미터로 입력!
write
close
delete -> 파일을 지움
** open ~ close를 하나의 session이라고 한다.
| |
-> 기본적으로 stdin 0 stdout 1 stderr 2 |
@ 리다이렉션 (redirection)
File descriptor 테이블에서 stdout이 f3로 바뀌면 output이 f3파일로 출력된다.
@ pipe()
> parallel : 60개 책상을 10명이 6개씩 나눠서 옮긴다.
> pipeline : 자동차를 각자 담당 부품만 조립한다.
이를 생산자 - 소비자 관계라고 한다
위 명령어는 f1파일의 내용이 wc 명령어의 input이 된다. 따라서 cat 명령어가 먼저 끝나야된다.
* 이것을 통해 맨 마지막에 만들어지는 프로세스에 가장먼저 실행될 명령이 있어야됨을 알 수 있다.
정리하면, shell은 command (실행파일명)을 갖는다. shell이 하는 일은 fork 하는 일이다. 자식프로세스는 exec 명령을 통해서 변한다.
exit()를 통해 프로그램을 죽인다. 만약 프로그램에 exit 이 없으면 compiler가 프로그램 끝에 exit()를 넣어준다.
> & : 백그라운드 실행
> > : 리다이렉트
> | : 파이프라인