쉘 짜는 프로그램인데 처음 함수 분석좀 해주세요...
#include
#include
#include
#include
#define EOL 1 /* end of line */
#define ARG 2 /* normal argument */
#define AMPERSAND 3 /* for background job */
#define FOREGROUND 0
#define BACKGROUND 1
static char input[256]; /* buffer for input */
static char tokens[512]; /* buffer for tokens */
char *ptr, *tok;
int get_token(char **outptr)
/* get a token */
{
int type;
*outptr = tok;
/* skip white space */
while( (*ptr == ' ') || (*ptr == '\t'))
ptr++;
*tok++ = *ptr;
switch(*ptr++) {
case '\0' : type = EOL; break;
case '&' : type = AMPERSAND; break;
default : type = ARG;
while ((*ptr != ' ')&& (*ptr != '&')
&& (*ptr != '\t') && (*ptr != '\0'))
*tok++ = *ptr++;
}
*tok++ = '\0'; /* make sure null-terminated */
return(type);
}
int execute(char **comm, int how)
{
int pid;
if((pid = fork())< 0) {
fprintf(stderr,"msh:fork error\n");
return(-1);
}
else if (pid == 0) { /* in child */
execvp(*comm, comm);
fprintf(stderr,"msh:command not found\n");
exit(127);
}
/* for parent */
if (how == BACKGROUND) { /* if background jobs, no need to wait */
printf("[%d]\n", pid);
return 0;
}
while(waitpid(pid, NULL, 0) < 0) /* foreground jobs. wait it */
if (errno != EINTR) return -1;
return 0;
}
int main()
{
char *arg[512]; /* array of pointer to argument */
int how; /* foreground or background*/
int type; /* type of token */
int narg=0; /* number of arguments */
printf(" "); /* display prompt */
while(gets(input)) {
int finished;
ptr = input;
tok = tokens;
for(finished=0;!finished ; ) {
switch(type = get_token(&arg[narg])) {
case ARG :
narg++;
break;
case EOL:
case AMPERSAND:
how = (type == AMPERSAND) ? BACKGROUND : FOREGROUND;
arg[narg] = NULL;
if (narg != 0)
execute(arg, how);
narg = 0;
if (type == EOL)
finished = 1;
break;
}
} /* end of second while */
printf(" ");
} /* end of first while */
}
토큰 함수 부분을 하나 하나 메모지에 풀이를 해보려고 해봤는데 너무 어렵네요.. 코드 element 하니 코드가 깨져서 그냥 올려봅니다...
댓글 달기