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

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

17 179 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

Nội dung

Gi l p Shell L p trình Shell – ng L c H ng Gi l p Shell c a DOS Shell ph n giao ti p gi a user máy tính qua h u hành DOS Shell: dùng dòng l nh = tên l nh + [đ i dòng l nh] T p l nh n i trú (internal): cd, dir,… Các l nh ngo i trú (external) Có kh n ng n p (load) th c thi ch ng trình qua dòng l nh D u nh c (prompt) dòng l nh Hi n th k t qu th c thi l nh L p trình Shell – ng L c H ng 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 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 l nh 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” ); L p trình Shell – ng L c H ng Tham kh o m t đo n CT { 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 l nh khác } } } while ( cmdId != EXIT ) ); return 0; #include #include #include #include #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"); } L p trình Shell – ng L c H ng Cài đ t hàm phân gi i 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; } L p trình Shell – 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à cho t t nh t return NO; } ng L c H ng Khung thu t gi i chung cho hàm x lý l nh Shell: Thu t gi i ( vào argv: m ng chu i, nc : Z ): {0,1} x lý tính h p l c a đ 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 công c có 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 findnext : tìm ti p Dir Entry khác c ng th a tiêu chu n y VC++ ( 6, NET ) : _findfirst _findnext L p trình Shell – ng L c H ng Li t kê TM File m t TM Thu t gi i ListDir Li t kê TM File 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) đ ng d n đ n TM c n tìm t ffblk : struct ffblk m u tin l u tr k t qu tìm x lý đ ng d n n u c n: n u ch có đ i å path = “\\*.*” ng c l i : path = argv[1]; n u path không t n t i ‘*’ å thêm “\\*.*” int done = findfirst ( path, &ffblk, FA_ARCH | FA_DIREC ); n u tìm không th y return 0; L p ( !done ) //tìm th y { ShowDirEntry(ffblk); done = findnext (&ffblk ); } return 1; } L p trình Shell – ng L c H ng Xu t Dir-Entry thu t gi i : ShowDirEntry ( vào de : đ a ch DirEntry ): Æ { G i attr: Z thu c tính Dir Entry G i s : chu i (80) dòng xu t L y attr = de->ff_attrib; n u Volume Label Không xu t 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/ n u TM ho c kích th c n u file / ngày /gi :(AM/PM) xu t dòng xu t } L p trình Shell – ng L c H ng Cài đ t hi n th dir-entry C, C++ for DOS void ShowDirEntry( struct ffblk * ffblk) { unsigned char fattr = ffblk.ff_attrib; unsigned tmp; if ( ( fattr & 0x8 ) == ) { k = sprintf ( s ,"%-13s ", ffblk.ff_name ); if ( fattr == 0x10 ) k +=sprintf( s+k,"%s%*c","", 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 dir-entry printf("%s\n",s ); } } L p trình Shell – ng L c H ng 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 L p trình Shell – D: xây d ng hàm t o th m c Cú pháp l nh: MD Nh n xét : có đ i: int mkDir(char* argv[], int n){ if(n!=2){ // ki m s đ i l nh printf(“syntax: md \n”); return -1; } int err=mkdir(argv[1]); if(!err) printf(“”unable create\n”);//? return err; } ng L c H ng Các l nh x lý file c a Shell Tìm hi u l nh c a shell (cú pháp, s đ i,…)v file sau: 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 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 (ch a h t file src) đ c hay kh i byte(s) t src, ghi vào dest đóng file l i L p trình Shell – ng L c H ng 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 : tr file M file theo argv[2], ch đ ghi å fp N u m không đ c : báo l i 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 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 N u dem==512 ghi lên file dem=0 N u dem > ghi ph n buffer lên file; h t óng file Return 1; } L p trình Shell – ng L c H ng Tham kh o đo n CT #include int main() { char ch; char buffer[512]; int dem=0; while( (ch=getchar())!=EOF){ buffer[dem++]=ch; if(dem==512){ // đ y bufferå xu t buffer for(int i=0; i[...]...Các l nh x lý file c a Shell Tìm hi u các l nh c a shell (cú pháp, s đ i,…)v file sau: 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... 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 L p trình Shell – ng L c H ng 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... // 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; } L p trình Shell – ng L c H ng Tham kh o 1 đo n CT #include int main() { char ch; char buffer[512]; int dem=0; while( (ch=getchar())!=EOF){ buffer[dem++]=ch; if(dem==512){ // đ y bufferå xu t buffer for(int... trong đó : CON : tên file thi t b ng console 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 } Chú ý :^Z : d u hi u k t thúc file v n b n L p trình Shell – ng L c H ng Tham kh o: L nh Copy (đ c ghi t ng kh i) int Copyfile (char* argv[],int nc ) // sao chép t file ngu n đ n file đích { if(nc!=3){ printf("Syntax: COPY source dest\nCOPY CON dest\n");... (dem=fread(buffer,1,512,fs)) ) // đ c file ngu n lên buffer cho đ n khi h t file fwrite(buffer,dem,1,fd); // ghi lên file đích fclose(fs); // đóng file ngu n fclose(fd); // đóng file đích return 1; } L p trình Shell – ng L c H ng Tham kh o: L nh Copy (đ c khi t ng byte) int Copyfile (char* argv[], int nc ) // sao chép t file ngu n đ n file đích { char ch; // buffer if(nc!=3){ printf("Syntax: COPY source dest\nCOPY... (dem=fread(&ch,1,1,fs)) ) fwrite(&ch,1,1,fd); fclose(fs); fclose(fd); return 1; // đ c file ngu n lên buffer cho đ n khi h t file // ghi lên file đích // đóng file ngu n // đóng file đích } L p trình Shell – ng L c H ng 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... // 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 tr v thành công L p trình Shell – ng L c H ng Tham kh o Type (đ c/xu t t ng byte) int Typefile (char* argv[],int nc ) // hi n th file v n b n { char ch; // buffer if(nc!=2){ printf("Syntax: TYPE \n"); return 0; } FILE *fp;... c { printf("%s not found\n",argv); return 0; } // đ c file lên buffer cho đ n khi h t file while ( fread(&ch,1,1,fp) ) putchar(ch); // xu t ra d ng kí t fclose(fp); // đóng file return 1; } L p trình Shell – ng L c H ng ...Gi l p Shell c a DOS Shell ph n giao ti p gi a user máy tính qua h u hành DOS Shell: dùng dòng l nh = tên l nh + [đ i dòng l nh] T p l nh... curdir[MAXPATH], cmdl[81]; char* argv [ N ]; int cmdId, nparam ; printf ( "Dos Shell : type EXIT to return "); } L p trình Shell – ng L c H ng Cài đ t hàm phân gi i tra b ng l nh int Phantich(char*... trình qua dòng l nh D u nh c (prompt) dòng l nh Hi n th k t qu th c thi l nh L p trình Shell – ng L c H ng 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

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

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w