| #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <errno.h> #include <sys/stat.h> char parsecmd(char *); /************關于本文檔******************************************** *filename:用C語言編寫一個Linux下的簡單shell程序 *purpose:展示了C語言如何進行系統調用執行logout cd ls pwd pid rm mkdir mv cp等命令 *wrote by: zhoulifa(zhoulifa@163.com) 周立發(http://zhoulifa.bokee.com) Linux愛好者 Linux知識傳播者 SOHO族 開發者 最擅長C語言編程 *date time:2006-07-16 15:00:00 *Note: 任何人可以任意復制代碼并運用這些文檔,當然包括你的商業用途 * 但請遵循GPL。 *Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力 *********************************************************************/ int main(int argc, char ** argv) { ? char cmd[1024]; ? char tmp[101]; ? char b = 'F'; ? char * p; ? while(1)?{ ??? memset(cmd, 0, 1024); ??? printf("Next command%% ");/*顯示提示信息*/ ??? fgets(cmd, 1000, stdin);/*接受用戶輸入,命令最長1000個字符*/ ??? cmd[strlen(cmd) - 1] = 0;/*去掉輸入的回車符*/ ??? b = parsecmd(cmd);/*分析取得用戶命令字*/ ??? if(b=='T') break;/*如果是logout就退出程序*/ ??? switch(b){ ??? case 1:/*切換工作目錄*/ ????? if(chdir(cmd + 3) != 0) { ??????? printf("chdir(%s) error!%s\n", cmd + 3, strerror(errno)); ????? } ????? printf("I'm working in '%s' now\n", getcwd(tmp, 100)); ????? break; ??? case 2:/*ls命令*/ ??? case 7:/*cp命令*/ ??? case 8:/*pwd命令*/ ????? system(cmd); ????? break; ??? case 3:/*pid命令*/ ????? printf("%d\n", getpid()); ????? break; ??? case 4:/*rm命令*/ ????? remove(cmd + 3); ????? break; ??? case 5:/*mkdir命令*/ ????? mkdir(cmd + 6, 0755); ????? break; ??? case 6:/*mv命令*/ ????? p = strchr(cmd + 3, ' '); ????? *p = 0; ????? rename(cmd + 3, p + 1); ????? break; ??? case 0:/*不能識別的命令*/ ????? printf("Bad command, try again! All aviable commands are:\nlogout cd ls pwd pid rm mkdir mv cp\n", getpid()); ????? break; ??? } ? } } char parsecmd(char * s) { ? if(!strcasecmp(s, "logout"))?return 'T'; ? else if(!strncasecmp(s, "cd", 2))?return 1; ? else if(!strncasecmp(s, "ls", 2))?return 2; ? else if(!strncasecmp(s, "pwd", 3))?return 8; ? else if(!strncasecmp(s, "pid", 3))?return 3; ? else if(!strncasecmp(s, "rm", 2))?return 4; ? else if(!strncasecmp(s, "mkdir", 5))?return 5; ? else if(!strncasecmp(s, "mv", 2))?return 6; ? else if(!strncasecmp(s, "cp", 2))?return 7; ? else return 0; } |