3-2 week3 - 3
0.
reivew
wait함수를 쓰니깐 부모 프로세스가 더 늦게끝나서 프롬프트($)가 자식 프로세스가 다 끝나고 나서 생겼다.
process creation을 다시봅시다!
shell의 기본동작: 한개의프로그램있다가 fork로 두개로 분기하고 child에서 다른 프로그램을 실행해서 exec() 그게 끝날때까지 부모가 wait하고 다시 무언가를 한다.@!
ex) ls -l처럼 명령어를 내리면! 쉘이 fork해서 명령어를 exec한다. 부모가 이때 쉘이다.
근데, 만약에 wait하고 싶지 않으면 뒤에 &를 붙인다. gedit fork.c & 그러면 기다리질 않는다.
ps로 보면 자식 프로세스가 돌고있다.
1.
exit
마지막 코드가 끝나면 자동으로 호출된다.
wait의 인자를 통해서 exit로 자식 -> 부모 데이터이동이 가능하다.
process resource = memory space(stack, data...) , pcb(커널에서 관리하는 자료구조)
가 사라진다.
2.
실습 3.38 ppt(typical format) 23분참고
3.21의 그림을 실제 코드로 구현한 모습이다. -> 이걸 참고해서 과제를 하면 됨!
(7분)
여기서는 bin/ls라서 ls만 실행되는데
user input에 의해 읽어서 그 문자열을 execlp에 전달하면 된다.!!!!! 그냥 문자열 넘겨주면 될듯
여기서 wait의 리턴되는 값이 별로 안중요하니깐 이렇게 써도 돼
3.
다른 교재의 쉘 예제
simple shell 아 시언어로 프로그래밍하는 거네!
type_prompt(); 화면에 보여준다.
-> sungjun$ ...
read_command(...,....) 핵심!
->이런 함수를 만들어서 받아올 수 있도록 scanf로는 힘들겠다. gets로 받아와야겠는데?
char input[100];
gets(input);
strlen(), strcmp(), ... -> strtoken()을 이용하여 토큰별로 나누어준따 ex) ps -ax를 나눠줘서 2개의 인자로 받아야지! 1번 ps, 2번 -ax 인자
**help기능 -> man something like man wait 함수설명이 나온다.
execv로 하려면 ps,-ax를 문자열에 넣어주고 불러야한다. 그냥 execl로 부르면 나열에서 넣어줘야겠지?
***test: 내가 만들 쉘에서 ls를 해보는거지
*****원래 쉘에서 내 쉘실행은 ./myshell한다. 원래 shell의 child process로 돌아가는 것이고,,,, 거기서 또 child...
뱅글뱅글 도니깐 while인데 exit치면 빠져나오게 한다.
4.
process tree
a가 fork로 child를 계속 만들어서 tree를 만든다.
fork는 kernel이 사용자 편하라고 주는 api다.
신 -> 1번)아담init과 2번)이브kthreadd
터미널만큼 process를 만든다................으아ㅓㄹ
요즘은 가상터미널이라고 ptx라 한다.
로그인하면 getty프로세스가 login process로 바뀐다( exec()사용 )
그러고 패스워드를 통과하면 쉘(sh)로 바뀐다. 여기서 cp를 사용해서 또 프로세스가 만들어진다.
5.
ps tree하면 트리구조로 프로세스가 보여진다.
6.
과제제제제제ㅔㅈ
1번. bash라는 쉘이 실행되고 있다. == /bin/bash가 실행되고 있다.
2번. myshell.c를 통해서 나만의 쉘을 실행시킨다.
3번. 부모쉘이 fork해서 같은 프로세스가 복제되고 그것이 exec를 호출해서 myshell을 실행시키는 것과 같다.
그러면 fork로 생성된 쉘이 myshell로 대체가 된다.
4번. 이제 프롬프트가 바뀌는 거지요 그럼 여기서 ls를 사용하면 나만의 쉘에서 명령어를 처리하는 거지 그럼 명령어를 내리면 fork를 해서 나의 프로세스가 복제가 되고 거기서 exec를 호출해서 ls프로세스를 실행시켜준다.
5번. exit를 하면 내 쉘이 끝나고 원래 터미널의 프롬프트가 나오게 된다.
ok let's get it
'이제는 사용하지 않는 공부방 > Operating system' 카테고리의 다른 글
| [운영체제] thread = 실 (0) | 2020.09.21 |
|---|---|
| [운영체제] exec, wait (0) | 2020.09.16 |
| [운영체제] process creation (0) | 2020.09.16 |
| [운영체제] 리눅스란 (0) | 2020.09.12 |