diff options
Diffstat (limited to 'dev/c/src/basic/shell.c')
-rw-r--r-- | dev/c/src/basic/shell.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/dev/c/src/basic/shell.c b/dev/c/src/basic/shell.c new file mode 100644 index 0000000..addc8a7 --- /dev/null +++ b/dev/c/src/basic/shell.c @@ -0,0 +1,57 @@ +#include <sys/types.h> +#include <sys/wait.h> +#include <errno.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sysexits.h> +#include <unistd.h> + +char *getinput(char *buffer, size_t buflen) { + printf("$$ "); + return fgets(buffer, buflen, stdin); +} + +void sig_int(int signo) { + printf("\nCaught SIGINT (Signal #%d)!\n$$ ", signo); + (void)fflush(stdout); +} + +int main(int argc, char **argv) { + char buf[BUFSIZ]; + pid_t pid; + int status; + + /* cast to void to silence compiler warnings */ + (void)argc; + (void)argv; + + if (signal(SIGINT, sig_int) == SIG_ERR) { + fprintf(stderr, "signal error: %s\n", strerror(errno)); + exit(1); + } + + 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_UNAVAILABLE); + } + + /* parent waits */ + if ((pid=waitpid(pid, &status, 0)) < 0) { + fprintf(stderr, "shell: waitpid error: %s\n", + strerror(errno)); + } + } + + exit(EX_OK); +} |