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

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