/* * World's simplest shell. * Loops, reads input and tries to execute it. * Note: no tokenization, can be ^C'd, but does look at PATH * not sorted * * ./simple-shell * $$ ls * $$ /bin/ls * $$ /bin/ls -la # error * $$ ^C * */ #include #include #include #include #include #include #include #include char * getinput(char *buffer, size_t buflen) { printf("$$ "); return fgets(buffer, buflen, stdin); } int main(int argc, char **argv) { char buf[1024]; pid_t pid; int status; while (getinput(buf, sizeof(buf))) { buf[strlen(buf) - 1] = '\0'; if((pid=fork()) == -1) { fprintf(stderr, "shell: can't fork: %s\n", strerror(errno)); continue; } else if (pid == 0) { /* child */ execlp(buf, buf, (char *)0); fprintf(stderr, "shell: couldn't exec %s: %s\n", buf, strerror(errno)); exit(EX_DATAERR); } if ((pid=waitpid(pid, &status, 0)) < 0) fprintf(stderr, "shell: waitpid error: %s\n", strerror(errno)); } exit(EX_OK); }