1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài Giảng Giả Lập Shell

17 180 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 258,07 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

óng file Return 1;.

Trang 1

Gi l p Shell

Trang 2

Gi l p Shell c a DOS

Shell là ph n giao ti p gi a user và máy tính qua h đi u hành

T p l nh n i trú (internal): cd, dir,…

Các l nh ngo i trú (external)

D u nh c (prompt)

và dòng l nh

Hi n th k t qu

th c thi l nh

Trang 3

OS Shell: Gi i thu t x lý l nh n i trú

Ý t ng gi i thu t:

G i cmdl: chu i ch a dòng l nh nh p ( đ i l nh ng n cách b i blank hay tab) cmdId: ch s l nh trong b ng l nh

L p:

Xu t d u nh c;

Ch nh n dòng l nh å cmdl;

Phân tích l nh ( cmdl å nparam, argv );

N u không có l nh nào thì quay v đ u l p;

Ng c l i,

Tra b ng l nh ( argv[0] å cmdId );

N u không t n t i l nh, báo l i , quay v đ u l p

Ng c l i,

Tùy theo cmdId mà x lý l nh t ng ng;

Khi ( argv[0] ≠ “EXIT” );

Trang 4

Tham kh o m t đo n CT

do { printf("%s>", getcwd ( curdir,128 ) ); // xu t d u nh c fflush ( stdin ); gets ( cmdl ); // ch nh n dòng l nh nparam = Phantich ( cmdl , argv ); // phân tích l nh

if ( nparam ) { cmdId = Trabang ( argv[0] ); // tra b ng

if ( cmdId == NO ) printf( "Bad command\n" );

else{

switch ( cmdId ){

case CD : // Sinh viên b sung x lý l nh

break;

case DIR: if( Dir ( nparam, argv ) ) perror( "Error");

break;

// Sinh viên b sung các l nh khác }

} } while ( cmdId != EXIT ) );

return 0;

}

#include <dos.h>

#include <dir.h>

#include <stdio.h>

#include <string.h>

#define N 10

enum { NO= -1 , CD = 0, DATE, DIR };

int Phantich ( char* cmdl, char* argv[] );

int Trabang ( char* cmd );

int Dir ( int argc, char* argv[] );

int main ( void )

{ char curdir[MAXPATH], cmdl[81];

char* argv [ N ];

int cmdId, nparam ;

printf ("Dos Shell : type EXIT to

return \n");

Trang 5

Cài đ t 2 hàm phân gi i và tra b ng l nh

int Phantich(char* cmdl, char* argv[] )

{ int ncmd=0;

char* p = strtok ( cmdl, " \t" );

while ( p != NULL ) {

argv [ncmd++] = p;

p = strtok ( NULL, " \t" );

}

return ncmd;

}

int Trabang ( char* cmd )

{ char cmdtab[N][5]={"CD","DATE","DIR"};

// Sinh viên t xây d ng theo gi i thu t mà mình cho là t t nh t return NO;

}

Trang 6

Khung thu t gi i chung cho các hàm x lý l nh

trong Shell:

Thu t gi i <l nh> ( vào argv: m ng chu i, nc : Z ): {0,1}

x lý tính h p l c a các đ i l nh // tùy thu c t ng l nh

x lý b sung (n u có )

cài đ t thu t gi i tùy theo ng ngh a , ho t đ ng và công c có trong tay.

Ví d : xây d ng hàm x lý l nh DIR:

Gi s đã xây d ng hàm xu t m t DirEntry: void ShowDirEntry ( ); Hàm th vi n đã có :

C, C++ for DOS : findfirst : tìm Dir Entry đ u tiên th a tiêu chu n

và findnext : tìm ti p Dir Entry khác c ng th a tiêu chu n y

VC++ ( 6, NET ) : _findfirst và _findnext

Trang 7

Li t kê các TM và File trong m t TM

Thu t gi i ListDir Li t kê các TM và File trong m t TM

int ListDir ( int argc, char* argv[] )

{ N u (nc>3) xu t help nh return 0; //Ki m tra h p l ?

Ng c l i:

t path: chu i (128) là đ ng d n đ n TM c n tìm

t ffblk : struct ffblk là m u tin l u tr k t qu tìm

x lý đ ng d n n u c n:

n u ch có 1 đ i å path = “\\*.*”

ng c l i :

path = argv[1];

n u path không t n t i ‘*’ nào å thêm “\\*.*”

int done = findfirst ( path, &ffblk, FA_ARCH | FA_DIREC );

n u tìm không th y thì return 0;

L p khi ( !done ) //tìm th y { ShowDirEntry(ffblk); done = findnext (&ffblk );

} return 1;

}

Trang 8

Xu t 1 Dir-Entry

thu t gi i : ShowDirEntry ( vào de : đ a ch DirEntry ): Æ { G i attr: Z là thu c tính trên Dir Entry

G i s : chu i (80) là dòng xu t

L y attr = de->ff_attrib;

n u là Volume Label thì

Không xu t và quay v ;

ng c l i:

xây d ng dòng xu t theo d ng m t dòng xu t: tên / m r ng/ <DIR> n u là TM

ho c kích th c n u là file / ngày /gi :(AM/PM)

xu t dòng xu t }

Trang 9

Cài đ t hi n th 1 dir-entry

C, C++ for DOS

void ShowDirEntry ( struct ffblk * ffblk)

{ unsigned char fattr = ffblk.ff_attrib;

unsigned tmp;

if ( ( fattr & 0x8 ) == 0 )

{ k = sprintf ( s ,"%-13s ", ffblk.ff_name );

if ( fattr == 0x10 )

k +=sprintf( s+k,"%s%*c","<DIR>", 7, 0x20 );

else k += sprintf( s+k,"%12ld",ffblk.ff_fsize );

tmp= ffblk.ff_fdate;

// Sinh viên b sung vào đ in đ thông tin 1 dir-entry printf("%s\n",s );

}

}

Trang 10

T o, h y, chuy n th m c

Hàm C:

int mkdir(const char* path);// t o

int rmdir(const char* path); //h y

int chdir(const char* path); //chuy n

Tr v :

0: thành công, ≠0: có l i

Nh c:

“\” : kí hi u th m c g c , vd: cd \

“ ”: kí hi u th m c cha

“.”: kí hi u th m c hi n hành

D: xây d ng hàm t o th m c

Cú pháp l nh: MD <path>

Nh n xét : có 2 đ i:

int mkDir(char* argv[], int n){

if(n!=2){ // ki m s đ i l nh

printf(“syntax: md <path>\n”); return -1;

} int err=mkdir(argv[1]);

if(!err) printf(“”unable create\n”); //?

return err;

}

Trang 11

Các l nh x lý file c a Shell

Sao chép (copy), t o file v n b n (copy CON), hi n th file v n b n (type), xóa file (del).

Các hàm c a C v x lý file :

(xem l i ch d n trong bài tr c) :

fopen, fgetc , fputc , fread, fwrite, feof, fclose, remove, rename.

Ví d gi i thu t copyfile(const char* src, const char* dest) :

M file src đ đ c, file dest đ ghi

l p khi (ch a h t file src)

đ c 1 hay kh i byte(s) t src, ghi nó vào dest

đóng các file l i

Trang 12

Copy CON: so n th o file v n b n

Thu t gi i : copyCON ( vào argv: m ng tr char , nc:Z ): Z

{ G i fp : con tr file

M file theo argv[2], ch đ ghi å fp

N u m không đ c : báo l i và return 0;

G i buffer: m ng byte (512)

G i key: Z phím nh n đ c

G i dem :Z s đ m kí t nh p trên buffer

t dem =0 ;

Khi ch a k t thúc file CON // F6+ENTER : ^Z

Ch nh p phím -> key

L u vào buffer[dem] =key

T ng dem lên 1

N u dem==512 thì ghi lên file và dem=0

N u dem > 0 thì ghi ph n buffer này lên file;

h t khi.

óng file

Return 1;

Trang 13

Tham kh o 1 đo n CT

#include <stdio.h>

int main()

{ char ch;

char buffer[512];

int dem=0;

while( (ch=getchar())!=EOF){

buffer[dem++]=ch;

for(int i=0; i<512; i++)

putchar(buffer[i]);

}

}

for(int i=0; i<dem; i++) putchar(buffer[i]);

fflush(stdin); getchar();

return 0;

}

Chú ý :^Z : d u hi u k t thúc file v n b n

trình? Ý ngh a và tác d ng c a hàm int getchar() trong Borland C++ for DOS?

M r ng cho vi c cài đ t l nh:

Copy CON <dest>

trong đó :

dest : đ ng d n đ n file l u

Chú ý : c n xét getchar() trong ng

c nh c a m i trình biên d ch

Trang 14

Tham kh o: L nh Copy ( đ c ghi t ng kh i)

return 0;

}

FILE *fs, *fd;

int dem;

}

}

char buffer[512];

Trang 15

Tham kh o: L nh Copy ( đ c khi t ng byte)

if(nc!=3){ printf("Syntax: COPY source dest\nCOPY CON dest\n");

return 0;

}

FILE *fs, *fd;

}

}

return 1;

Trang 16

TYPE: hi n th n i dung 1 file v n b n

Thu t gi i typeFile ( vào : argv : tr char, nc: Z ): Z ={0,1}

N u s đ i nc !=2 thì xu t help nh , return 0; // ki m tra h p l

G i fp : tr FILE

m file argv[1] theo ch đ đ c å fp

N u không m đ c thì

Báo l i đ ng d n, return 0;

G i buffer : m ng byte (512); // vùng đ m ch a d li u đ c đ c

G i dem:Z là s byte đ c đ c sau m i l n đ c

L p : c t file m i l n 512 bytes å buffer, dem

xu t m ng byte theo s dem khi ch a h t file

óng file

Trang 17

Tham kh o Type ( đ c/xu t t ng byte)

if(nc!=2){ printf("Syntax: TYPE <path>\n"); return 0;

}

FILE *fp;

if( ( fp = fopen(argv[1],"rb")) == NULL ) // m file ngu n theo ch đ đ c { printf("%s not found\n",argv); return 0;

}

while ( fread(&ch,1,1,fp) ) // đ c file lên buffer cho đ n khi h t file

return 1;

}

Ngày đăng: 30/10/2015, 18:01

TỪ KHÓA LIÊN QUAN

w