본문 바로가기

IT

psh1.c

// 여세를 몰아 shell 프로그램을 만들어 봅시다.


// 는... 왜 이렇게 코드가 기냐...


// 갑자기... 적응 안되게...


// 하지만 그렇게 어려운 코드는 아닙니다.


// define한 maxargs 만큼 main에서 input을 받고, 그것을 makestring에서 엔터를 없애고, 널을 집어 넣은 다음 배열에 집어 넣습니다.


// 그렇게 만들어진 배열을 execute에서 execvp를 이용해 실행하면 끝.


// 코드 자체는 어렵지 않은데 처음엔 makestring이 왜 있나 싶었네요...




#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define maxargs 20
#define arglen 100

int execute(char* arglist[]);
char* makestring(char* buf);

int main(int argc, char* argv[])
{
    char* arglist[maxargs+1];
    int numargs = 0;
    char argbuf[arglen];
    while(numargs<maxargs)
    {
        printf("arg[%d] ? \n",numargs);
        if (fgets(argbuf, arglen, stdin) && *argbuf !='\n')
            arglist[numargs++] = makestring(argbuf);
        else
        {
            if(numargs>0)
            {
                arglist[numargs] = NULL;
                execute(arglist);
                numargs = 0;
            }
        }
    }
    return 0;
}

int execute(char* arglist[])
{
    execvp(arglist[0], arglist);
    perror("execvp failed");
    exit(1);
}

char* makestring(char* buf)
{
    char* cp;
    buf[strlen(buf) - 1] = '\0';
    cp = malloc(strlen(buf) + 1 );
    if ( cp == NULL)
    {
        fprintf(stderr,"no memory\n");
        exit(1);
    }
    strcpy(cp, buf);
    return cp;
}

'IT' 카테고리의 다른 글

waitdemo1.c  (0) 2014.11.11
forkdemo1.c  (0) 2014.11.11
before & after.c  (0) 2014.11.11
exec1.c  (0) 2014.11.11
set_ticker.c  (0) 2014.11.05