Custom Shell Program

System Call 함수들을 이용하여 간단하게 Custom Shell Program 을 만들 수 있다.
소스코드는 다음과 같다.

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

#define MAX_ORDER 1024

int main() {
    pid_t pid;
    char cmd[MAX_ORDER];
    int stat;
    while (1) {
        fprintf(stdout, "myShell$ ");
        gets(cmd);
        if (strcmp(cmd, "exit") == 0) {
            exit(0);
        }
        pid = fork();
        if (pid == 0) {
            execl("/bin/sh", "sh", "-c", cmd, NULL);
        } else if (pid > 0) {
            wait(&stat);
        } else {
            fprintf(stderr, "fork error: exit\n");
            exit(-1);
        }
        return 0;
    }
}

 

parent process에서 fork() 함수를 통해 새로운 child process를 생성하고, child process에서 shell command를 수행하게 된다.
fork 함수는 필요한 헤더로는 #include <unistd.h> 가 있으며, 이것의 return value는 다음과 같다.
* parent process의 경우: fork 성공 시, child process의 pid를 return.
* child process의 경우: 0을 return.
* return value가 -1인 경우: fork 실패.
더 자세한 사항은 man fork 를 해보면 나와 있다.
따라서, 위의 코드에서 if … else if … else 부분은 각각 parent process와 child process에서 다르게 수행되는 작업을 구분해놓은 것이다.

나머지 헤더 파일의 경우, #include <string.h>의 경우는 strcmp() 함수를 위해서이고, #include <stdlib.h> 는 exit() 함수를 위해서 include 되었다.
execl() 함수의 경우는 process를 실행해 주는 system call 함수이며, 위치는 /bin/sh 에 있다.
각 parameter의 경우에는 man page(man execl)를 참조하면 된다.
컴파일하고 실행을 해보면 다음과 같다.

댓글 남기기