Tải bản đầy đủ (.pdf) (17 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (258.07 KB, 17 trang )

Gi l p Shell

L p trình Shell –

ng L c H ng


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.
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) và th c thi ch ng trình qua dòng l nh.

D u nh c (prompt)
và 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 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” );

L p trình Shell –

ng L c H ng


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");

}


L p trình Shell –

ng L c H ng


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;
}

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à mình cho là t t nh t
return NO;
}

ng L c H ng


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

L p trình Shell –

ng L c H ng


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;
}
L p trình Shell –

ng L c H ng


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
}
L p trình Shell –

ng L c H ng



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 );
}
}
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ó 2 đ 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 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 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 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;
}
L p trình Shell –


ng L c H ng


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;
if(dem==512){ // đ y bufferå xu t buffer
for(int i=0; i<512; i++)
putchar(buffer[i]);
// reset buffer
dem=0;
}
}
for(int i=0; ifflush(stdin); getchar();
return 0;

c k và cho bi t m c tiêu ch ng
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 đó :

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");
return 0;
}
if( stricmp(argv[1],"CON")== 0 ) return copyCON(argv,nc); // n u là copy CON
FILE *fs, *fd;
int dem;
if( (fs = fopen(argv[1],"rb")) == NULL )
// m file ngu n theo ch đ đ c
{
printf("%s not found\n",argv[1]); return 0;
}
if( (fd = fopen(argv[2],"wb")) == NULL )
// m file đích theo ch đ ghi
{
printf("Path not found\n"); return 0;

}
char buffer[512];
while ( (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 CON dest\n");
return 0;
}
if( stricmp(argv[1],"CON")== 0 ) return copyCON(argv,nc); // n u là copy CON
FILE *fs, *fd;
// m file ngu n theo ch đ đ c
if( (fs = fopen(argv[1],"rb")) == NULL )
{
printf("%s not found\n",argv[1]); return 0;

}
if( (fd = fopen(argv[2],"wb")) == NULL )
// m file đích theo ch đ ghi
{
printf("Path not found\n"); return 0;
}
while ( (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
m file argv[1] theo ch đ đ c å fp
N u không m đ c thì
Báo l i đ ng d n, return 0;

Ng c l i,
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
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;
if( ( fp = fopen(argv[1],"rb")) == NULL ) // m file ngu n theo ch đ đ 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



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×