출처: https://3months.tistory.com/307 [Deep Play]

4-1/시스템프로그래밍

Shell

코딩하는 랄뚜기 2022. 3. 22. 21:40

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