Shell Programs
Shell이란 사용자로부터 받은 명령을 실행시키는 application이다. Kernel과 사용자 사이의 다리역할을 한다고 보면 된다.
Shell Program의 종류에는 sh, csh/tcsh, bash가 있다.
우리 학교의 리눅스 서버에서는 bash를 이용하고 있다.
Shell program은 while문을 돌면서 항상 명령어를 받을 준비를 하고 있다. (오른쪽은 코드)
ls-al(명령어)를 치면 eval함수가 실행된다. eval함수는 명령어가 실행가능하다면 fork를 띄우고 execve함수를 사용하여 명령어를 실행한다. background이냐 foreground이냐에 따라 이후에 처리가 달라지는데,,, 이해를 못했다 ㅋㅋ
Foreground process : Shell에서 사용자가 명령을 내리면 process가 해당 명령을 완료 할 때까지 사용자가 다른 입력을 넣을 수 없다.
Background process : 사용자 입력과 상관없이 실행되는 process. 명령어 맨 뒤에 &를 붙이면 background에서 명령이 실행된다.
Background에서는 사용자 입력과 상관없이 process가 실행되기 때문에 ECF를 활용해야 한다.
Pipe
Pipe( | )는 부모 프로세스가 자식 프로세스에게 data를 넘겨줄 수 있게 해준다.
부모만이 자식에게 data를 넘겨주기 때문에 Unidirectional하다
ps -aux | grep root | tail
위는 ps 프로세스의 output을 grep 프로세스가 input으로 받고, grep 프로세스의 output을 tail 프로세스가 input으로 받아 output를 내라는 명령어이다.
Pipe 특징
- pipe에 data는 FIFO형식으로 출입한다
- sender와 receiver 모두 pipe안에 data 구조를 알 수 없다.
- pipe의 접근은 file descriptor에서의 reading과 writing으로 이루어진다.
Pipe.c 코드
#include <stdio.h>
#include <unistd.h>
int main(){
int n,fd[2],pid,child_status; char line[100];
if(pipe(fd)<0) exit(-1);// Pipe에 fd를 넣는다.
if((pid=fork())<0) exit(-1);
else if(pid>0){ // Parent
close(fd[0]); // Parent에 input(fd[0])은 닫는다.
write(fd[1],"Hello World\n",12); //input(fd[1])에 값을 넣는다
wait(&child_status); // child를 기다린다
}else{ // Child
close(fd[1]); // Child의 output(fd[1])을 닫는다.
n=read(fd[0],line,100); // Pipe에서 값을 읽어 온다
write(STDOUT_FILENO,line,n); // 읽어온 값을 출력한다.
}
}
Pipe.c Flow
'4-1 > 시스템프로그래밍' 카테고리의 다른 글
Unix I/O, RIO package (0) | 2022.04.04 |
---|---|
Signal (0) | 2022.03.28 |
Process Control (0) | 2022.03.15 |
Processes (4) | 2022.03.10 |
Exceptional Control Flow, Exception (0) | 2022.03.09 |