Snowdream

I'm awake but my world is half asleep
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

支持参数和后台运行的shell

Posted on 2007-08-28 15:37 ZelluX 阅读(519) 评论(0)  编辑  收藏 所属分类: C/C++
CSAPP上的例子,但是书中的源码有问题,修改后的版本:
#include "csapp.h"
#define MAXARGS 128

void eval(char *cmdline);
int parseline(char *buf, char **argv);
int buildin_command(char **argv);

int main()
{
    
char cmdline[MAXLINE];

    
while (1)
    {
        printf(
"");
        Fgets(cmdline, MAXLINE, stdin);
        
if (feof(stdin))
            exit(
0);

        eval(cmdline);
    }
}

void eval(char *cmdline)
{
    
char *argv[MAXARGS];
    
char buf[MAXLINE];
    
int bg;
    pid_t pid;

    strcpy(buf, cmdline);
    bg 
= parseline(buf, argv);
    
if (argv[0== NULL)
        
return;

    
if (!builtin_command(argv))
    {
        
if ((pid = Fork()) == 0)
        {
            
if (execve(argv[0], argv, environ) < 0)
            {
                printf(
"%s: Command not found.\n", argv[0]);
                exit(
0);
            }
        }
        
        
if (!bg)
        {
            
int status;
            
if (waitpid(pid, &status, 0< 0)
                unix_error(
"waitfg: waitpid error");
        }
        
else
            printf(
"%d %s", pid, cmdline);
    }
    
return;
}

int builtin_command(char **argv)
{
    
if (!strcmp(argv[0], "quit"))
        exit(
0);
    
if (!strcmp(argv[0], "&"))
        
return 1;
    
return 0;
}

int parseline(char *buf, char **argv)
{
    
char *delim;
    
int argc;
    
int bg;

    buf[strlen(buf) 
- 1= ' ';
    
while (*buf && (*buf == ' '))
        buf
++;

    argc 
= 0;
    
while ((delim = strchr(buf, ' ')))
    {
        argv[argc
++= buf;
        
*delim = '\0';
        buf 
= delim + 1;
        
while (*buf && (*buf == ' '))
            buf
++;
    }
    argv[argc] 
= NULL;

    
if (argc == 0)
        
return 1;

    
if ((bg = (*argv[argc - 1== '&')) != 0)
        argv[
--argc] = NULL;

    
return bg;
}



只有注册用户登录后才能发表评论。


网站导航: