要設計的shell 類似于sh,bash,csh 等,必須支援以下内部指令:
cd <目錄>更改目前的工作目錄到另一個<目錄>。如果<目錄>未指定,輸出目前工作目錄。如
果<目錄>不存在,應當有适當的錯誤資訊提示。這個指令應該也能改變PWD 的環境變量。
environ 列出所有環境變量字元串的設定(類似于Unix 系統下的env 指令)。
echo <内容 > 顯示echo 後的内容且換行
help 簡短概要的輸出你的shell 的使用方法和基本功能。
jobs 輸出shell 目前的一系列子程序,必須提供子程序的命名和PID 号。
quit,exit,bye 退出shell。
平台:Centos
如何用linux系統編寫c程式https://blog.csdn.net/qq_36328643/article/details/52794876
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char cmd[2100];
while(1)
{
printf("請輸入操作:");
scanf("%s",cmd);
int len=strlen(cmd),i;
if(cmd[0] == 'e' && cmd[1] == 'c') // echo
{
int flag=0;
for( i=5; i<len-1; i++)
{
if(cmd[i]!=' ') flag=1;
if(flag)
{
putchar(cmd[i]);
}
}
if(flag) putchar('\n');
}
else if(cmd[0]=='q' || cmd[1]=='x' || cmd[0]=='b') // quit,exit,bye
{
printf("Bye\n");
return 0;
}
else if(cmd[0]=='h') // help
{
printf("/**********************************/\n");
printf("echo <content>\tprint a line content\n");
printf("quit,exit,bye\tend produce\n");
printf("cd <catalog>\techo catalog\n");
printf("jobs\techo process name and pid...\n");
printf("environ\techo environment variable\n");
printf("/**********************************/\n");
}
else
{
char cata[100];
int cnt=0;
if(cmd[0]=='c') // cd
{
int flag=0;
for( i=3; i<len; i++)
{
if(cmd[i]!=' ') flag=1;
if(flag)
{
cata[cnt++] = cmd[i];
}
}
if(cnt==0)
{
cata[0]='.';
cata[1]='\0';
}
}
/* fork a child process */
pid_t pid = fork();
if (pid < 0)
{
/* error occurred */
fprintf(stderr, "Fork Failed");
return 1;
}
else if(pid==0)
{
if(cmd[0]=='c') // cd
{
execlp("/bin/ls",cata,NULL);
}
else if(cmd[0]=='j') // jobs
{
execlp("pstree","-p",NULL);
}
else if(cmd[0]=='e') // environ
{
execlp("env","",NULL);
}
}
else
{
/* wait wait,until child process exit*/
wait();
}
}
printf("\n");
}
return 0;
}