From 8ed1fa992c5e8e9aa3694e064db294a5c3f7416c Mon Sep 17 00:00:00 2001 From: LEE JEONG EUN <dlwjddms0102@hanmail.net> Date: Tue, 8 May 2018 17:27:31 +0900 Subject: [PATCH] final--- --- include/built_in.h | 3 + include/commands.c | 0 src/built_in.c | 6 +- src/commands.c | 214 ++++++++++++++++++++++++++++++++++++++++-- src/main.c | 45 +++++++-- src/signal_handlers.c | 20 +++- test | Bin 0 -> 7380 bytes test.c | 12 +++ 8 files changed, 280 insertions(+), 20 deletions(-) create mode 100644 include/commands.c create mode 100755 test create mode 100644 test.c diff --git a/include/built_in.h b/include/built_in.h index b2df0aa..27588e0 100644 --- a/include/built_in.h +++ b/include/built_in.h @@ -1,6 +1,9 @@ #ifndef BUILT_IN_H_ + #define BUILT_IN_H_ +int bgpid_num; +char running[1024]; typedef int (*built_in_command_do)(int, char**); typedef int (*built_in_command_validate)(int, char**); diff --git a/include/commands.c b/include/commands.c new file mode 100644 index 0000000..e69de29 diff --git a/src/built_in.c b/src/built_in.c index 9a466e9..cb8c540 100644 --- a/src/built_in.c +++ b/src/built_in.c @@ -32,12 +32,16 @@ int do_pwd(int argc, char** argv) { return 0; } + int do_fg(int argc, char** argv) { if (!validate_fg_argv(argc, argv)) return -1; // TODO: Fill this. - + int state; + // printf("\nbgpid_num=%d\n",bgpid_num); + waitpid(bgpid_num,&state,0); + // printf("waitpid complete\n"); return 0; } diff --git a/src/commands.c b/src/commands.c index 13e9c33..5347500 100644 --- a/src/commands.c +++ b/src/commands.c @@ -2,16 +2,140 @@ #include <stdlib.h> #include <string.h> #include <assert.h> - +#include <stdio_ext.h> +#include <unistd.h> #include "commands.h" #include "built_in.h" +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <arpa/inet.h> +#include <pthread.h> +#include"built_in.h" + +#define BUFF_SIZE 1024 +#define SOCKET_PATH "tpf_unix_sock.server" +#define SERVER_PATH "tpf_unix_sock.server" +#define CLIENT_PATH "tpf_unix_sock.clent" + + static struct built_in_command built_in_commands[] = { { "cd", do_cd, validate_cd_argv }, { "pwd", do_pwd, validate_pwd_argv }, - { "fg", do_fg, validate_fg_argv } + { "fg", do_fg, validate_fg_argv }, + }; + + +void * server(void*** argvp ){ + int server_socket, client_socket, client_addr_size; + char buf[256]; + char ***argv=*(char ***)argvp; + struct sockaddr_un server_addr; + struct sockaddr_un client_addr; + + memset(&server_addr,0, sizeof(struct sockaddr_un)); + memset(&client_addr, 0, sizeof(struct sockaddr_un)); + memset(buf, 0, 256); + + server_socket = socket(AF_UNIX, SOCK_STREAM, 0); + if(server_socket < 0) {printf("server socket fail\n"); + exit(0);} + + bzero(&server_addr, sizeof(server_addr)); + server_addr.sun_family = AF_UNIX; + strcpy(server_addr.sun_path, SOCKET_PATH); + int len = sizeof(server_addr); + unlink(SOCKET_PATH); +int state =bind(server_socket,(struct sockaddr*)&server_addr, len); + if(state ==-1) { + printf("bind error\n"); + exit(1); + } +state = listen(server_socket, 5); + if(state ==-1){ + printf("listen error\n"); + exit(1); + } +while(1){ + client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &len); + +if(client_socket == -1){ + printf("client connect fail\n"); + close(server_socket); + close(client_socket); + exit(1); + } + + +int pid; +if((pid=fork())<0) + perror("fork fail\n"); +else if (pid !=0) + sleep(1); +else { + + dup2(client_socket,0); + execv(argv[0][0],argv[0]); + } +} + + +close(client_socket); + +} + +void * client(void*** argvp){ + + int client_socket; + char ***argv=*(char ***)argvp; + struct sockaddr_un server_addr; + struct sockaddr_un client_addr; + char buf[256]; + + memset(&server_addr, 0, sizeof(struct sockaddr_un)); + memset(&client_addr,0, sizeof(struct sockaddr_un)); + + + client_socket = socket (AF_UNIX, SOCK_STREAM, 0); + if(client_socket == -1) + { + printf("client socket fail\n"); + exit(1); + } + bzero(&client_addr, sizeof(client_addr)); + client_addr.sun_family = AF_UNIX; + strcpy(client_addr.sun_path, CLIENT_PATH); + int len = sizeof(client_addr); + + server_addr.sun_family = AF_UNIX; + strcpy(server_addr.sun_path, SERVER_PATH); + + if(connect(client_socket, (struct sockaddr*)&server_addr, len) == -1) + { + printf("connect fail\n"); + exit(1); + } + + + + int pid; + if((pid = fork())<0) + perror("fork fail\n"); + else if (pid != 0) + sleep(1); + else { + dup2(client_socket,1); + close(client_socket); + execv(argv[0][0],argv[0]); + exit(1); + } + close(client_socket); + exit(0); +} + static int is_built_in_command(const char* command_name) { static const int n_built_in_commands = sizeof(built_in_commands) / sizeof(built_in_commands[0]); @@ -22,12 +146,9 @@ static int is_built_in_command(const char* command_name) } } - return -1; // Not found + return -1; } -/* - * Description: Currently this function only handles single built_in commands. You should modify this structure to launch process and offer pipeline functionality. - */ int evaluate_command(int n_commands, struct single_command (*commands)[512]) { if (n_commands > 0) { @@ -49,12 +170,84 @@ int evaluate_command(int n_commands, struct single_command (*commands)[512]) return 0; } else if (strcmp(com->argv[0], "exit") == 0) { return 1; - } else { - fprintf(stderr, "%s: command not found\n", com->argv[0]); - return -1; + } else if (strcmp(com->argv[0], "vim") == 0){ + for(int i=0;i<n_commands; i++){ + int pid, status; + if((pid = fork())<0) perror("Don't execute fork"); + else if (pid >0) wait(&status); + else { + char temp[512] = "/usr/bin/"; + strcat(temp, com->argv[0]); + strcpy(com->argv,temp); + bgpid_num=getpid(); + printf("\n%d\n",bgpid_num); + execv(com->argv[0], com->argv); + if(execv(com->argv[0], com->argv)) + { + fprintf(stderr, "%s: command not found\n", com->argv[0]); + return -1; + } + + } + } + return 0; + } else if(n_commands >=2){ + + int pid, status; + pthread_t pt[2]; + int a =5; + char ***pointer; + pointer=&(com->argv); + if((pid = fork())<0) + perror("fork fail\n"); + if(pid > 0){ + com = (*commands)+1; + pointer=&(com->argv); + pthread_create(&pt[0], NULL, &server, (void*)&pointer); + sleep(2); + } + else { + pthread_create(&pt[1], NULL, &client, (void*)&pointer); + sleep(2); + } + return 0; + } else { + + + for(int i=0;i<n_commands; i++){ + int status; + int pid; + + if((pid = fork())<0) perror("Don't execute fork"); + else if (pid>0){ + printf("%s\n",com->argv[com->argc-1]); + if(strcmp(com->argv[com->argc-1],"&")) + wait(&status); + } + else { + bgpid_num = getpid(); + printf("\n%d\n",bgpid_num); + execv(com->argv[0], com->argv); + + if(execv(com->argv[0], com->argv)) + { + char c[100] = "/bin/"; + strcat(c, com->argv[0]); + com->argv[0] = c; + execv(com->argv[0], com->argv); + if(execv(com->argv[0],com->argv)){ + fprintf(stderr, "%s: command not found\n", com->argv[0]); + return -1; + } + } + } + } + + } - } + + } return 0; } @@ -74,3 +267,4 @@ void free_commands(int n_commands, struct single_command (*commands)[512]) memset((*commands), 0, sizeof(struct single_command) * n_commands); } + diff --git a/src/main.c b/src/main.c index 77c7804..8116d8f 100644 --- a/src/main.c +++ b/src/main.c @@ -5,27 +5,58 @@ #include "commands.h" #include "built_in.h" #include "utils.h" - +#include "signal_handlers.h" +#include <signal.h> int main() { - char buf[8096]; +/* +signal(SIGINT,(void*)catch_sigint); +signal(SIGTSTP,(void*)catch_sigtstp); +*/ + char buf[8096]; while (1) { + signal(SIGINT, &catch_sigint); + signal(SIGTSTP, &catch_sigtstp); fgets(buf, 8096, stdin); - struct single_command commands[512]; int n_commands = 0; + int background = 0; + if(buf[strlen(buf)-1]=='&'){ + background = 1; + buf[strlen(buf)]=0; + memset(running,NULL,1024); + strcpy(running,buf); + break; + } mysh_parse_command(buf, &n_commands, &commands); - + if(background){ + bgpid_num = fork(); + if(bgpid_num){ + free_commands(n_commands, &commands); + n_commands =0; + continue; + } + } int ret = evaluate_command(n_commands, &commands); - free_commands(n_commands, &commands); n_commands = 0; + /* if(bgpid_num == 0){ + if(ret == 0){ + fprintf(stdout,"%d done %s\n",getpid(),running); + } + free_commands(n_commands,&commands); + n_commands = 0; + exit(0); + }*/ + free_commands(n_commands, &commands); + n_commands = 0; + if (ret == 1) { break; - } + } + memset(buf,NULL,8096); } - return 0; } diff --git a/src/signal_handlers.c b/src/signal_handlers.c index 4b6fe2e..1968cf5 100644 --- a/src/signal_handlers.c +++ b/src/signal_handlers.c @@ -1,11 +1,27 @@ + #include "signal_handlers.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/wait.h> +#include <signal.h> void catch_sigint(int signalNo) -{ +{ + signal(SIGINT, &catch_sigint); + printf("\nShell doesn't close!\n"); + + // TODO: File this! } void catch_sigtstp(int signalNo) -{ +{ + signal(SIGTSTP, &catch_sigtstp); + printf("\nIt doesn't move!\n"); // TODO: File this! } + + + diff --git a/test b/test new file mode 100755 index 0000000000000000000000000000000000000000..d0f40c3cf28498811ed4a1c215e1f9c6258d1f01 GIT binary patch literal 7380 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/test.c b/test.c new file mode 100644 index 0000000..2459f92 --- /dev/null +++ b/test.c @@ -0,0 +1,12 @@ +#include<string.h> +#include<stdio.h> +#include<unistd.h> + +void main(){ + + while(1){ + printf("background\n"); + sleep(5); + } +} + -- GitLab