/* minish.c - example of a minimalistic shell * Comments in code deliberately omitted. :-) */ #include #include #include #include #include #include #include #include #define MAXLINE 80 static int cpid = 0; void inthandler(int sig) { if (cpid) { kill(cpid, sig); waitpid(cpid, NULL, 0); cpid = 0; fprintf(stderr, "killed\n"); } signal(SIGINT, inthandler); } int main(int argc, char **argv) { char line[MAXLINE+1], *args[MAXLINE], *p, **arg; if (argc>=2 && !freopen(argv[1], "r", stdin)) { perror(argv[1]); exit(errno); } signal(SIGINT, inthandler); while (printf("%s","$ "), fgets(line, MAXLINE, stdin)) { if ((p = strchr(line, '\n'))) { *p=0; } else { fprintf(stderr, "line too long\n"); exit(1); } p = line; while (*p == ' ') ++p; if (*p == '#' || !*p) continue; *(arg=args) = p; while ((p = strchr(p, ' '))) { while (*p == ' ') *p++ = 0; if (*p) *++arg=p; } *++arg=NULL; if (!strcmp(line,"exit")) { exit(args[1] ? atoi(args[1]) : 0); } switch ((cpid=fork())) { case 0: execvp(args[0], args); perror(args[0]); exit(errno); case -1: perror("fork() failed"); break; default: wait(NULL); cpid = 0; } } exit(0); }