45 lines
961 B
C
45 lines
961 B
C
|
#include <sys/types.h>
|
|||
|
#include <sys/wait.h>
|
|||
|
|
|||
|
#include <errno.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
#include <sysexits.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
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);
|
|||
|
}
|