资源简介
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
- 上一篇:正则表达式转换为nfa以c语言源程序
- 下一篇:自制FFT频谱分析软件
评论
共有 条评论