当前位置: 技术问答>linux和unix
【高分求解】 请帮帮忙,修改这个UNIX shell程序 【UP有分】 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
来源: 互联网 发布时间:2015-12-14
本文导语: ★★★★★★★★★★★★★★★★★★★ 各位大侠,小弟才开始接触UNIX下的shell编程. 目前这几个功能无法实现,非常郁闷.... ...
★★★★★★★★★★★★★★★★★★★
各位大侠,小弟才开始接触UNIX下的shell编程.
目前这几个功能无法实现,非常郁闷....
请大家帮帮忙 修改一下下面这个UNIX shell程序
★★★★★★★★★★★★★★★★★★★
/////////////////////////////////////////////////////////////////////////
1. 写一个logout的功能可以使用户退出shell
2. CD.. 和 CD. 的功能可以返回父目录。 CD 进入子目录 提示:用chdir()
3. 写一个history的功能来显示最近的10个命令。
4. 重定向功能,用(, 和 >>) 提示输入输出
///////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#define MAXLINE 200
#define MAXARG 20
#define FALSE 0
#define TRUE 1
extern char **environ;
static int getargs(int *argcp, char *argv[], int max, int *eofp)
{
static char cmd[MAXLINE];
char *cmdp;
int i;
*eofp = FALSE;
if (fgets(cmd, sizeof(cmd), stdin)==NULL)
{
if (ferror(stdin))
fprintf(stderr, "error in reading from stdinn");
*eofp=TRUE;
return FALSE;
}
cmdp=cmd;
*argcp=0;
for (i=0;i=max)
{
printf("Too many args -- command ignoredn");
return(FALSE);
}
return(TRUE);
}
static void execute2(int argc, char *argv[])
{
pid_t pid;
switch (pid=fork()) {
case -1: /* parent (error) */
fprintf(stderr,"Error in fork()n");
break;
case 0: /* child */
execvp(argv[0], argv);
fprintf(stderr,"Cannot executen");
exit(0); /* exit the child process when failure to execute */
break;
default: /* parent */
wait(NULL);
break;
}
return;
}
void set(int argc, char *argv[])
{
int i;
if (argc!=1)
printf("Extra argsn");
else
for (i=0;environ[i]!=NULL;i++)
printf("%sn", environ[i]);
}
int main(void)
{
char *argv[MAXARG];
int argc;
int eof;
while (TRUE) {
/* print the prompt */
printf("%s@ ",getenv("USER"));
/* get arguments from the user input and parse them into the argument array */
if (getargs(&argc, argv, MAXARG, &eof))
/* if the user inputs a command instead of a return */
if (argc>0)
{
/* if the user's input is the shell command "set" */
if (strcmp(argv[0], "set")==0)
set(argc, argv);
/* else execute the command */
else
execute2(argc, argv);
}
if (eof)
exit(0);
}
return(0);
}
各位大侠,小弟才开始接触UNIX下的shell编程.
目前这几个功能无法实现,非常郁闷....
请大家帮帮忙 修改一下下面这个UNIX shell程序
★★★★★★★★★★★★★★★★★★★
/////////////////////////////////////////////////////////////////////////
1. 写一个logout的功能可以使用户退出shell
2. CD.. 和 CD. 的功能可以返回父目录。 CD 进入子目录 提示:用chdir()
3. 写一个history的功能来显示最近的10个命令。
4. 重定向功能,用(, 和 >>) 提示输入输出
///////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#define MAXLINE 200
#define MAXARG 20
#define FALSE 0
#define TRUE 1
extern char **environ;
static int getargs(int *argcp, char *argv[], int max, int *eofp)
{
static char cmd[MAXLINE];
char *cmdp;
int i;
*eofp = FALSE;
if (fgets(cmd, sizeof(cmd), stdin)==NULL)
{
if (ferror(stdin))
fprintf(stderr, "error in reading from stdinn");
*eofp=TRUE;
return FALSE;
}
cmdp=cmd;
*argcp=0;
for (i=0;i=max)
{
printf("Too many args -- command ignoredn");
return(FALSE);
}
return(TRUE);
}
static void execute2(int argc, char *argv[])
{
pid_t pid;
switch (pid=fork()) {
case -1: /* parent (error) */
fprintf(stderr,"Error in fork()n");
break;
case 0: /* child */
execvp(argv[0], argv);
fprintf(stderr,"Cannot executen");
exit(0); /* exit the child process when failure to execute */
break;
default: /* parent */
wait(NULL);
break;
}
return;
}
void set(int argc, char *argv[])
{
int i;
if (argc!=1)
printf("Extra argsn");
else
for (i=0;environ[i]!=NULL;i++)
printf("%sn", environ[i]);
}
int main(void)
{
char *argv[MAXARG];
int argc;
int eof;
while (TRUE) {
/* print the prompt */
printf("%s@ ",getenv("USER"));
/* get arguments from the user input and parse them into the argument array */
if (getargs(&argc, argv, MAXARG, &eof))
/* if the user inputs a command instead of a return */
if (argc>0)
{
/* if the user's input is the shell command "set" */
if (strcmp(argv[0], "set")==0)
set(argc, argv);
/* else execute the command */
else
execute2(argc, argv);
}
if (eof)
exit(0);
}
return(0);
}
|
修改的代码如下,不知道怎么回事,重定向没有搞定。:(****
不管怎么样,先把修改的代码贴上来再说。****************
欢迎访问我的论坛http://www.techcookie.com/forum ******
******************************************************
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 200
#define MAXARG 20
#define FALSE 0
#define TRUE 1
#define HIS_SIZE 10
static int his_count = 0;
static int his_idx = 0;
static char his[HIS_SIZE][MAXLINE];
extern char **environ;
static int getargs(int *argcp, char *argv[], int max, int *eofp)
{
static char cmd[MAXLINE];
char *cmdp;
int i;
*eofp = FALSE;
if (fgets(cmd, sizeof(cmd), stdin)==NULL)
{
if (ferror(stdin))
fprintf(stderr, "error in reading from stdinn");
*eofp=TRUE;
return FALSE;
}
if (his_count
不管怎么样,先把修改的代码贴上来再说。****************
欢迎访问我的论坛http://www.techcookie.com/forum ******
******************************************************
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 200
#define MAXARG 20
#define FALSE 0
#define TRUE 1
#define HIS_SIZE 10
static int his_count = 0;
static int his_idx = 0;
static char his[HIS_SIZE][MAXLINE];
extern char **environ;
static int getargs(int *argcp, char *argv[], int max, int *eofp)
{
static char cmd[MAXLINE];
char *cmdp;
int i;
*eofp = FALSE;
if (fgets(cmd, sizeof(cmd), stdin)==NULL)
{
if (ferror(stdin))
fprintf(stderr, "error in reading from stdinn");
*eofp=TRUE;
return FALSE;
}
if (his_count