Linux 에서 간단 한 명령 인 터 랙 션 UI (클래스 셸 인 터 랙 션 인터페이스) 구현
3430 단어 LINUX 소프트웨어 개발
창작 이유:
이미 개 발 된 시스템 에 인원 의 조작 을 편리 하 게 하기 위해 명령 조작 인 터 페 이 스 를 제공 합 니 다.
기본 기능:
1. help, clear, dump, exit 등 명령 을 실현 합 니 다. 여 기 는 예제 로 만 사용 합 니 다.
2. 간단 한 줄 텍스트 편집 기능 (커서 의 좌우 이동, backspace 삭제 문자, 상하 방향 키 로 역사 명령 표시);
3. 리 턴 은 명령 의 읽 기 를 완성 한 다음 에 명령 을 해석 하고 작업 을 수행 하 며 다시 명령 수신 상태 로 돌아 갑 니 다.
원리:
매우 간단 하 다. 일부 컴퓨터 의 프로 그래 밍 기초 만 있 으 면 기본적으로 실현 의 방향 을 생각 할 수 있다.
즉, 하나의 순환 에 의 해 명령 을 받 고 명령 을 해석 하 며 작업 을 수행 하 며 다시 명령 수신 인터페이스 로 돌아 가 는 것 이다.
실현:
조사 연 구 를 통 해 curses. h 는 기본적으로 모든 창 조작 을 실현 할 수 있 음 을 발 견 했 습 니 다. 그래서 저 는 curses. h 를 잠시 선 택 했 습 니 다. 이 헤더 파일 은 libncurses 5 - dev 가방 에 있 는 것 입 니 다. 본인 의 시스템 은 centos 5.5 이 고 시스템 자체 에 관련 된 헤더 파일 과 라 이브 러 리 파일 을 가지 고 있 으 며 ubuntu 11.04 에 설치 하려 고 시도 한 적 이 있 습 니 다. 해당 하 는 설치 패 키 지 를 다운로드 하면 됩 니 다.다음은 본인 의 개발 절 차 를 소개 합 니 다.
1. 데이터 구조
// , shell , shell , 512
struct line_editor
{
char chars[512];//
int tail;//
int cur;//
};
// , ,
struct Cmd_Node
{
char* cmd_p;//
struct Cmd_Node* pre;//
struct Cmd_Node* next;//
int len;//
};
//
struct Cmd_List
{
struct Cmd_Node* head;//
struct Cmd_Node* tail;//
};
//
char* cmd_set[]={
"run",
"exit",
"help",
"clear",
"dump"
};
인터페이스 함수
static struct Cmd_List cmd_list; //
3. 보조 함수
int get_cmd();//
void shell_exit();//shell
void shell_init();//shell
static void hprintf(char* fmt,...);// print , , , printf
static void mem_dump(char* args);// dump
static void run(const char* cmd_p);// run
static void help();// help
4. 567913. 4. 사실 가장 핵심 적 인 것 은 하나의 줄 편집 기 를 실현 하면 OK 입 니 다. 다음은 우리 가 시작 하 겠 습 니 다. 먼저 생각 을 소개 하 겠 습 니 다.
셸 줄 편집기 에서 고려 해 야 할 요 소 는 다음 과 같 습 니 다.
a. 지원 하 는 문자 집합 (모든 보 이 는 문자)
b. 지원 하 는 편집 작업, 예 를 들 어 좌우 커서 의 이동, backspace 에서 문 자 를 삭제 합 니 다.
c. 상하 방향 키 로 과거 기록 전환 명령
d. Enter 종료 줄 편집, 입력 내용 되 돌리 기
입력 내용 은 명령 해석 프로그램 에서 분석 한 다음 에 해당 하 는 서브루틴 을 호출 합 니 다. 그러면 줄 편집 기 를 어떻게 실현 하 는 지 먼저 말씀 드 리 겠 습 니 다. 사실은 데이터 구조 와 화면 조작 이 서로 결 합 된 작업 입 니 다.
먼저 알고리즘 을 말 해 보 세 요. 다음 과 같 습 니 다.
a. 보 이 는 문자 라면 커서 가 있 는 위치, 커서 와 커서 뒤의 문 자 를 삽입 한 다음 에 문 자 를 이동 합 니 다.
b. backspace 라면 커서 이전의 문 자 를 삭제 하고 커서 와 커서 뒤의 문 자 를 앞으로 이동 하 며 커서 도 한 문 자 를 앞으로 이동 해 야 합 니 다.
c. 왼쪽 방향 키 라면 커서 가 왼쪽으로 한 문 자 를 이동 하고 오른쪽 방향 키 라면 커서 가 오른쪽으로 한 문 자 를 이동 합 니 다.
d. 위로 방향 키 를 누 르 면 역사 명령 링크 의 커서 가 한 노드 앞으로 이동 하여 현재 명령 줄 의 내용 을 지우 고 역사 명령 의 내용 을 표시 합 니 다. 커서 는 끝까지 이동 합 니 다.
e. 아래 방향 키 라면 과거 명령 링크 에서 커서 를 받 은 다음 노드 를 이동 하여 현재 명령 줄 의 내용 을 지우 고 과거 명령 의 내용 을 표시 합 니 다. 커서 는 끝까지 이동 합 니 다.
d. 리 턴 이 라면 입력 순환 을 끝내 고 명령 노드 를 만 들 고 이 노드 를 역사 명령 링크 의 끝 에 삽입 한 후 명령 에 있 는 문자 의 개 수 를 되 돌려 줍 니 다.
다음은 코드 를 올 리 겠 습 니 다.
//clear system("clear") , curses clear()
5. 상기 작업 을 하기 전에 curse 환경 을 초기 화해 야 합 니 다. 사용 이 끝 난 후에 정상 적 인 환경 과 메모리 방출 작업 을 해 야 합 니 다. 코드 는 다음 과 같 습 니 다.
//exit exit
프로그램 캡 처: