쉘 짜는 프로그램인데 처음 함수 분석좀 해주세요...

josimhaela의 이미지

#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 하니 코드가 깨져서 그냥 올려봅니다...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.