1. 使用fgets来获取当前命令
2. 使用getcwd API来获取当前路径
3. 使用getlogin_r来获取当前用户
效果:

/**
* jsh 程序,简单的shell程序
*
* created : jeff
* date: 2013.1.28
* version: first version
*
* modified: jeff
* date : 2013.1.29
* version : v1.0
* reason : 增加回显功能和显示用户以及当前目录的能力
*
*
* *********************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <getopt.h>
#define VERSION \
"jsh version 1.0.0\n"\
#define MAX_PATH_LENGTH 1024
#define MAX_COMMAND_LENGTH 1024
#define MAX_USER_LENGTH 128
#define USAGE\
"Usage: jsh [GNU long option] [option] ...\n\
jsh [GNU long option] [option] script-file ...\n\
long option:\n\
--version\n\
--help\n"\
static struct option longOptions[]=
{
{"version", 0, NULL,'v' },
{"help", 0, NULL, 'h'}
};
static char user[MAX_USER_LENGTH]={0,};
static char currentWorkPath[MAX_PATH_LENGTH]={0,};
static char command[MAX_COMMAND_LENGTH]={0,};
static void usage();
static void version();
static void readopt(int argc, char** argv);
int main(int argc, char** argv)
{
int opt = 0;
char* path = NULL;
int getuserret = 0;
if(argc<2)
{
while(1)
{
/**
*显示当前目录和用户
*/
if((path=getcwd(currentWorkPath, sizeof(currentWorkPath))) == NULL)
break;
if( getuserret = getlogin_r(user, sizeof(user)) !=0)
break;
fprintf(stdout, "%s:%s$ ", user, currentWorkPath);
if(fgets(command, sizeof(command), stdin))
{
/**
*
* TODO do command stuff
*
*/
}else
{
break;
}
}
}else
{
readopt(argc, argv);
}
return 0;
}
static void usage()
{
fprintf(stdout, USAGE);
}
static void version()
{
fprintf(stdout, VERSION);
}
static void readopt(int argc, char** argv)
{
int opt=0;
while( (opt=getopt_long(argc,argv,"vh",longOptions, NULL)) !=EOF)
{
switch(opt)
{
case 'h':
usage();
break;
case 'v':
version();
break;
default:
usage();
break;
}
}
}
作者:littleflasher_jeff 发表于2013-1-29 22:51:21 原文链接
阅读:56 评论:0 查看评论