목차
1. 프로젝트 목적
2. 프로젝트 구성 기본 요구사항
3. 프로젝트 설계
4. 프로그램 구동 시 출력 화면
2. 프로젝트 구성 기본 요구사항
3. 프로젝트 설계
4. 프로그램 구동 시 출력 화면
본문내용
를 배열 처음으로 이동 및 끝은 널 문자저장
for(파이프,리다이렉션 뒤의 명령어 문자가 끝날 때까지)
그 문자를 배열처음부터 순차적으로 이동시킴
다 이동 후 마지막은 널 문자를 집어너 문자열 끝을 알림
token(사용자가 입력한 명령어, 토큰으로 저장할 포인터 배열);
//명령어2 토큰 분리
}
return 0;
}
/* 명령어 공간 초기화 함수 선언 */
int init_cmd()
{
for(입력받을 수 있는 명령어의 길이만큼 반복 수행)
{
입력받을 수 있는 명령어 공간 2개를 모두 널문자로 초기화
}
}
/* 프로세스 작업 지정 함수 선언 */
int mysh()
{
switch(프로세스 생성(복제))
{
case 생성이 안됐을 경우:
fatal("fork failed");
case 자식 프로세스일 경우:
명령어 수행 루틴으로 감
break;
}
//부모프로세스
if(bground==1) //백그라운드 작업 시
{
백그라운드 작업을 화면에 표시
bground=백그라운드 작업 체크값 0으로 초기화;
프롬프트를 받기위해 명령어를 기다리지 않고 리턴함
}
if(자식프로세스를 기다림==-1) //일반 명령어일 경우
return -1; //비정상
else return 프로세스 status정보를 리턴; //정상
}
/* 명령어 타입에 따른 실행 함수 선언 */
int cmd_execution()
{
switch(명령어 타입 식별 번호)
{
case 1: 파이프 명령어 처리 함수 호출
case 2: left_리다이렉션 명령어 처리 함수 호출
case 3: right_리다이렉션 명령어 처리 함수 호출
일반 명령어일 경우:
일반 명령어 execvp로 수행
fatal(수행 못할 시 에러메시지);
}
}
/* PIPE 처리 함수 선언 */
int pipe_cmd()
{
if(pipe(p)==-1) //파이프 생성
fatal(실패시 에러메시지);
switch(프로세스 생성(복제))
{
case 생성이 안 될 경우:
fatal(에러메시지);
case 0:
dup2(파이프의 쓰기부분,표준출력); //stdout -> pipe
표준출력을 파이프로 바꿨으므로 파이프 읽기,쓰기 닫음
execvp(수행될 명령어);
fatal("exec failed");
default:
dup2(파이프의 읽기부분,표준입력); //pipe -> stdin
표준입력을 파이프로 바꿨으므로 파이프 읽기, 쓰기 닫음
execvp(수행될 명령어);
fatal("exec failed");
}
}
/* LEFT_REDIRECTION 처리 함수 선언 */
int left_rdirct()
{
fd=명령어 수행결과를 저장할 사용자가 만든 파일 fd 생성
bk=표준출력을 복귀시키기 위한 dummy fd 생성
close(더미 닫음);//stdin->file->stdin
dup2(표준입력,더미fd); //백업과정
dup2(저장할파일,표준입력);//표준입력을 넘김
close(저장할파일 fd닫음);
system(리다이렉션 이전의 명령어를 실행); //명령어 실행
dup2(백업한 더미fd,표준입력); //표준입력을 다시 복귀
remove(잠시 백업공간으로 사용했던 dummy파일 삭제);
execl("/usr/bin/ls",(char *)0); //프로세스 종료를 위해 신호를 보냄
}
/* RIGHT_REDIRECTION 처리 함수 선언 */
int right_rdirct()
{
fd=명령어 수행결과를 저장할 사용자가 만든 파일 fd 생성
bk=표준출력을 복귀시키기 위한 dummy fd 생성
close(더미 fdeke음);//stdout->file->stdout
dup2(표준출력,더미fd); //백업과정
dup2(저장할파일,표준출력);//표준출력을 넘김
close(저장할파일 fd닫음);
system(리다이렉션 이전의 명령어를 실행); //명령어 실행
dup2(백업한 더미fd,표준출력); //표준출력을 다시 복귀
remove(잠시 백업공간으로 사용했던 dummy파일 삭제);
execl("/usr/bin/ls",(char *)0); //프로세스 종료를 위해 신호를 보냄
}
/* 에러 처리 함수 선언 */
int fatal(에러 메시지)
{
perror(에러 메시지를 출력);
exit(1); //비정상종료
}
4. 프로그램 구동 시 출력 화면
① my쉘 프로그램 시작 및 파이프, 리다이렉션 공백 구분하여 수행
② background 작업 수행
③ background 작업 시 process의 변화 수행
④ my쉘 프로그램 종료 수행
for(파이프,리다이렉션 뒤의 명령어 문자가 끝날 때까지)
그 문자를 배열처음부터 순차적으로 이동시킴
다 이동 후 마지막은 널 문자를 집어너 문자열 끝을 알림
token(사용자가 입력한 명령어, 토큰으로 저장할 포인터 배열);
//명령어2 토큰 분리
}
return 0;
}
/* 명령어 공간 초기화 함수 선언 */
int init_cmd()
{
for(입력받을 수 있는 명령어의 길이만큼 반복 수행)
{
입력받을 수 있는 명령어 공간 2개를 모두 널문자로 초기화
}
}
/* 프로세스 작업 지정 함수 선언 */
int mysh()
{
switch(프로세스 생성(복제))
{
case 생성이 안됐을 경우:
fatal("fork failed");
case 자식 프로세스일 경우:
명령어 수행 루틴으로 감
break;
}
//부모프로세스
if(bground==1) //백그라운드 작업 시
{
백그라운드 작업을 화면에 표시
bground=백그라운드 작업 체크값 0으로 초기화;
프롬프트를 받기위해 명령어를 기다리지 않고 리턴함
}
if(자식프로세스를 기다림==-1) //일반 명령어일 경우
return -1; //비정상
else return 프로세스 status정보를 리턴; //정상
}
/* 명령어 타입에 따른 실행 함수 선언 */
int cmd_execution()
{
switch(명령어 타입 식별 번호)
{
case 1: 파이프 명령어 처리 함수 호출
case 2: left_리다이렉션 명령어 처리 함수 호출
case 3: right_리다이렉션 명령어 처리 함수 호출
일반 명령어일 경우:
일반 명령어 execvp로 수행
fatal(수행 못할 시 에러메시지);
}
}
/* PIPE 처리 함수 선언 */
int pipe_cmd()
{
if(pipe(p)==-1) //파이프 생성
fatal(실패시 에러메시지);
switch(프로세스 생성(복제))
{
case 생성이 안 될 경우:
fatal(에러메시지);
case 0:
dup2(파이프의 쓰기부분,표준출력); //stdout -> pipe
표준출력을 파이프로 바꿨으므로 파이프 읽기,쓰기 닫음
execvp(수행될 명령어);
fatal("exec failed");
default:
dup2(파이프의 읽기부분,표준입력); //pipe -> stdin
표준입력을 파이프로 바꿨으므로 파이프 읽기, 쓰기 닫음
execvp(수행될 명령어);
fatal("exec failed");
}
}
/* LEFT_REDIRECTION 처리 함수 선언 */
int left_rdirct()
{
fd=명령어 수행결과를 저장할 사용자가 만든 파일 fd 생성
bk=표준출력을 복귀시키기 위한 dummy fd 생성
close(더미 닫음);//stdin->file->stdin
dup2(표준입력,더미fd); //백업과정
dup2(저장할파일,표준입력);//표준입력을 넘김
close(저장할파일 fd닫음);
system(리다이렉션 이전의 명령어를 실행); //명령어 실행
dup2(백업한 더미fd,표준입력); //표준입력을 다시 복귀
remove(잠시 백업공간으로 사용했던 dummy파일 삭제);
execl("/usr/bin/ls",(char *)0); //프로세스 종료를 위해 신호를 보냄
}
/* RIGHT_REDIRECTION 처리 함수 선언 */
int right_rdirct()
{
fd=명령어 수행결과를 저장할 사용자가 만든 파일 fd 생성
bk=표준출력을 복귀시키기 위한 dummy fd 생성
close(더미 fdeke음);//stdout->file->stdout
dup2(표준출력,더미fd); //백업과정
dup2(저장할파일,표준출력);//표준출력을 넘김
close(저장할파일 fd닫음);
system(리다이렉션 이전의 명령어를 실행); //명령어 실행
dup2(백업한 더미fd,표준출력); //표준출력을 다시 복귀
remove(잠시 백업공간으로 사용했던 dummy파일 삭제);
execl("/usr/bin/ls",(char *)0); //프로세스 종료를 위해 신호를 보냄
}
/* 에러 처리 함수 선언 */
int fatal(에러 메시지)
{
perror(에러 메시지를 출력);
exit(1); //비정상종료
}
4. 프로그램 구동 시 출력 화면
① my쉘 프로그램 시작 및 파이프, 리다이렉션 공백 구분하여 수행
② background 작업 수행
③ background 작업 시 process의 변화 수행
④ my쉘 프로그램 종료 수행
소개글