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