static char inpbuf[MAXBUF], tokbuf[2 * MAXBUF], *ptr = inpbuf, *tok = tokbuf;

独自空忆成欢 提交于 2021-01-07 02:47:45

问题


static char inpbuf[MAXBUF], tokbuf[2 * MAXBUF], *ptr = inpbuf, *tok = tokbuf; The array inpbuf is intended to store the user typed command and its arguments. The array tokbuf is intended to store each extracted tokens from inpbuf, such that, each element in the array char *arg[MAXARG + 1]; (in proc_line.c) is properly assigned using the information in tokbuf in order later on to invoke execvp system call in runcommand.c.

I wanted to get rid of tokbuf and make the program still work. I compiled it like this: cc main_smallsh.c userin.c runcommand.c proc_line.c -o smallsh. The program basically shows the listing of the current directory.

//main_smallsh.c
#include "smallsh.h"

char *prompt = "Command> ";

int userin(char *p);
void procline(void);

int main()
{
    while (userin(prompt) != EOF)
        procline();
}









//proc_line.c
#include "smallsh.h"
#include <string.h>
#include <stdlib.h>

int gettok(char **outptr);
int runcommand(char **cline, int where);


void procline(void) 
{
    char *arg[MAXARG + 1]; 
    int toktype; 
    int narg; 
    int type; 

    narg = 0;

    for (;;) 
    {
       switch (toktype = gettok(&arg[narg])) {
        case ARG:
            if (narg < MAXARG)
                narg++;
            break;
        case EOL:
        case SEMICOLON:
        case AMPERSAND:
            if (toktype == AMPERSAND)
                type = BACKGROUND;
            else
                type = FOREGROUND;
            if (narg != 0)
            {
                arg[narg] = NULL;
                runcommand(arg, type);
            }
            if (toktype == EOL)
                return;
            narg = 0;
            break;
      }
      //added for assignment 3
//          if (!strcmp(arg[narg-1],"exit"))
//      exit(5);
    }
}






//runcommand.c
#include "smallsh.h"
#include <unistd.h>
#include <stdlib.h>

int runcommand(char **cline, int where)
{
    pid_t pid;
    int status;
    switch (pid = fork()) {
        case 1:
            perror("smallsh");
            return (-1);
        case 0:
            execvp(cline[0], cline);
            perror(*cline);
            exit(1);
    }
    //code for parents
    if (where == BACKGROUND)
    {
        printf("[process id %d]\n", pid);
        return (0);
    }
    
    if (waitpid(pid, &status, 0) == -1)
        return (-1);
    else
        return (status);
}






//smallsh.h

//*****************************************************************
#include <sys/wait.h>
#include <stdio.h>

//#include <sys/wait.h>

#define EOL 1 
#define ARG 2 

#define AMPERSAND 3 
#define SEMICOLON 4 
#define MAXARG 512 
#define MAXBUF 512 

#define FOREGROUND 0 
#define BACKGROUND 1









//userin.c
#include "smallsh.h"

static char inpbuf[MAXBUF], tokbuf[2 * MAXBUF],
*ptr = inpbuf, *tok = tokbuf;

int inarg(char c);

int userin(char *p)
{
    int c, count;
    ptr = inpbuf;
    tok = tokbuf;
    
    printf("%s", p);
    count = 0;
    while (1)
    {
        if ((c = getchar()) == EOF)
            return(EOF);
        if (count < MAXBUF)
            inpbuf[count++] = c;
        if (c == '\n' && count < MAXBUF)
        {
            inpbuf[count] = '\0';
            return count;
        }
        
        if (c == '\n')
        {
            printf("smallsh: input line too long\n");
            count = 0;
            printf("%s ", p);
        }
    }
}

int gettok(char **outptr)
{
    int type;
    
    *outptr = tok;
    
    while (*ptr == ' ' || *ptr == '\t')
        ptr++;
    
    *tok++ = *ptr;
    
    switch (*ptr++) {
    case '\n':
        type = EOL;
        break;
    case '&':
        type = AMPERSAND;
        break;
    case ';':
        type = SEMICOLON;
        break;
    default:
        type = ARG;
        
        while (inarg(*ptr))
            *tok++ = *ptr++;
    }
    *tok++ = '\0';
    return type;
}

//****************************************************************************************
static char special[] = { ' ', '\t', '&', ';', '\n', '\0' };
int inarg(char c)
{
    char *wrk;
    for (wrk = special; *wrk; wrk++)
    {
        if (c == *wrk)
            return (0);
    }
    return (1);
}

来源:https://stackoverflow.com/questions/64938894/static-char-inpbufmaxbuf-tokbuf2-maxbuf-ptr-inpbuf-tok-tokbuf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!