• 大小: 15KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-07-22
  • 语言: C/C++
  • 标签: C+shell  

资源简介

1、应用UNIX的fork()等系统调用,编写一个c程序具有以下功能: a) 实现Shell的基本功能,包括有:打印提示符; 接受和分析命令行(滤去无效的空格、tab符号以及换行符等);执行命令(要有出错处理;输入exit或者bye退出);返回父进程;b) 处理后台程序(不需要wait)c) 处理多行命令(分析命令行中的‘;’并处理之)<br>d)应用 dup(), pipe()系统调用具有输入输出重定向以及管道功能;收缩

资源截图

代码片段和文件信息

	/*************************************************
    目的:
1、应用UNIX的fork()等系统调用,编写一个c程序具有以下功能:
  a) 实现Shell的基本功能,包括有:打印提示符;
      接受和分析命令行(滤去无效的空格、tab符号以及换行符等);
      执行命令(要有出错处理;输入exit或者bye退出);返回父进程;
  b) 处理后台程序(不需要wait)
  c) 处理多行命令(分析命令行中的‘;’并处理之)
  d)应用 dup() pipe()系统调用具有输入输出重定向以及管道功能;

    文件名:my_shell.c
    作者:鹿珂珂 2005011534
    日期:2008年5月31日
***************************************************/


/************头文件************/
#include 
#include 
#include 
#include 
#include 
#include 
#include 



   /**************全局变量定义***************/
const int BUFFERSIZE=80;//接收命令的最大字符数
char buffer[80];//缓存用户输入的命令

int is_back=0;//是否是后台进程默认不是后台执行的程序
int status=0;//状态变量
pid_t pid;//进程


  
/**************函数声明***************/
char *get_command(int *input_len);//获取输入命令
void dispose_command(char *deal_inint len);//解析处理命令
int redirect(char * in int len);//实现输入输出重定向的函数
int piple(char * in int li_inlen);//实现管道功能的函数
int is_fileexist(char * comm);//用来查找命令是否存在
void multi_command(char * m_in int m_len);//处理用分号区分的多个命令


int main()//主函数:调用get_command()和dispose_command()实现shell的基本功能
{
char * path;//当前路径
char *user;//用户名
char *input=NULL;//用户输入命令
int command_len=0;//输入字符个数
while(1) 
{
command_len=0;
path = get_current_dir_name();//获取当前目录
user=getlogin();//获取当前登录用户
printf(“%s@%s-desktop:~%s$“useruser path);//用户输入提示符:用户名@用户名-desktop:~当前目录$
if(input)
free(input);//释放上一次输入命令内存空间
input=get_command(&command_len);//获取命令
if(input)
{
dispose_command(inputcommand_len);//处理执行命令
}
}
}



char *get_command(int * input_len)//获取用户输入命令
{
char lc_char;//输入字符
char *get_in;
(*input_len)=0;
/* 开始获取输入 */
lc_char = getchar();
while(lc_char != ‘\n‘ && (*input_len) < BUFFERSIZE)
{
     buffer[(*input_len) ++] = lc_char;
      lc_char = getchar();
}

/* 命令超长处理*/
if((*input_len) >= BUFFERSIZE) {
      printf(“Your command too long ! Please reenter your command !\n“);
      (*input_len) = 0;     /* Reset */
   gets(buffer);
   strcpy(buffer““);
   get_in=NULL;
        return NULL;
}
else  
    buffer[(*input_len)] = ‘\0‘; /*加上串结束符,形成字符串*/

if((*input_len)==0)return NULL;//处理直接敲入回车的情况

/* 将命令从缓存拷贝到in中*/
get_in = (char *)malloc(sizeof(char) * ((*input_len) + 1));
strcpy(get_in buffer);
strcpy(buffer““);
return get_in;
}


void dispose_command(char *deal_inint len)//调用multi_command()、piple()、redirect()分别实现多个命令、管道、重定向
{
char * arg[30];//存储指令或参数
int i=0 j=0 k=0;//计数变量
pid_t pid;//进程
/* 获取命令和参数并保存在arg中*/
 for( i=0;i<=len;i++)
 {
if(deal_in[i]==‘;‘)
{
multi_command(deal_inlen);
return;
}
 }
 for( i = 0 j=0k=0; i<=len; i ++) {
/*管道和重定向单独处理*/
if(deal_in[i]==‘<‘ || deal_in[i] == ‘>‘ || deal_in[i] == ‘|‘ || deal_in[i]==‘;‘) {
  if(deal_in[i] == ‘|‘)
{
            piple(deal_in len);
     return;
}
   else if

评论

共有 条评论

相关资源