日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

用C语言编写一个Linux下的简单shell程序

發(fā)布時(shí)間:2025/6/15 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用C语言编写一个Linux下的简单shell程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這是一個簡單的C程序,展示了如何進(jìn)行系統(tǒng)調(diào)用執(zhí)行l(wèi)ogout cd ls pwd pid rm mkdir mv cp等命令,這是一個簡單的命令解釋程序shell,其源代碼如下:

#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 *);
/************關(guān)于本文檔********************************************
*filename:用C語言編寫一個Linux下的簡單shell程序
*purpose:展示了C語言如何進(jìn)行系統(tǒng)調(diào)用執(zhí)行l(wèi)ogout cd ls pwd pid rm mkdir mv cp等命令
*wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言編程
*date time:2006-07-16 15:00:00
*Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途
* 但請遵循GPL。
*Hope:希望越來越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力
*********************************************************************/
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;
}

命令運(yùn)行結(jié)下:

Next command% ls /
bin?? cdrom? dev? home??? initrd.img? lost+found? mnt? proc? sbin? sys? usr? vmlinuz
boot? data?? etc? initrd? lib???????? media?????? opt? root? srv?? tmp? var
Next command% pwd
/data/example/c
Next command% cd /
I'm working in '/' now
Next command% pwd
/
Next command% cd /tmp
I'm working in '/tmp' now
Next command% pwd
/tmp
Next command% ls
gconfd-administrator? ksocket-administrator? plugtmp?????????????????????????????????? ssh-MmlTLh5149
gconfd-root?????????? mapping-administrator? scim-helper-manager-socket-administrator? virtual-administrator.XSmKSv
kde-administrator???? orbit-administrator??? scim-panel-socket:1-administrator
keyring-g5rmCS??????? orbit-root???????????? scim-socket-frontend-administrator
Next command% mkdir xxxx
Next command% ls
gconfd-administrator? ksocket-administrator? plugtmp?????????????????????????????????? ssh-MmlTLh5149
gconfd-root?????????? mapping-administrator? scim-helper-manager-socket-administrator? virtual-administrator.XSmKSv
kde-administrator???? orbit-administrator??? scim-panel-socket:1-administrator???????? xxxx
keyring-g5rmCS??????? orbit-root???????????? scim-socket-frontend-administrator
Next command% rm xxxx
Next command% ls
gconfd-administrator? ksocket-administrator? plugtmp?????????????????????????????????? ssh-MmlTLh5149
gconfd-root?????????? mapping-administrator? scim-helper-manager-socket-administrator? virtual-administrator.XSmKSv
kde-administrator???? orbit-administrator??? scim-panel-socket:1-administrator
keyring-g5rmCS??????? orbit-root???????????? scim-socket-frontend-administrator
?

Next command% logout

總結(jié)

以上是生活随笔為你收集整理的用C语言编写一个Linux下的简单shell程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。