#include #include #include #include #include #include #include #include char * get_input(char *buffer, size_t buflen) { printf("$$ "); return fgets(buffer, buflen, stdin); } int main(int argc, char **argv) { char buf[BUFSIZ]; pid_t pid; int status; // Cast to void to prevent compiler warning (void)argc; (void)argv; while(get_input(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) { execlp(buf, buf, (char *)0); fprintf(stderr, "SHELL: Can’t exec %s: %s\n", buf, strerror(errno)); exit(EX_UNAVAILABLE); } // Parent waits if ((pid = waitpid(pid, &status, 0)) < 0) { fprintf(stderr, "SHELL: waitpid error: %s\n", strerror(errno)); } } exit(EX_OK); }