Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<sys/types.h>
  6. #include<sys/wait.h>
  7. #include<signal.h>
  8. #define MAXL 500 //Max Input
  9. #define ARGS 20 //Max number of arguments
  10. //handle the signal SIGCHLD when a child process is terminated
  11. void signalHandler(int sig_num)
  12. {
  13. FILE *fp;
  14. fp=fopen("shell_logfile.log","a+");// Open log file
  15. if(fp == NULL)
  16. {
  17. printf("\nerror:couldn't open file");
  18. }
  19. else fprintf(fp,"Child process was terminated\n");
  20. fclose(fp);
  21.  
  22. }
  23. void ExecuteBackground(char *parsedArguments){
  24. pid_t pid = fork();
  25. if(pid<0){
  26. printf("Forking Error");
  27. }
  28. else{
  29. if{pid==0}{
  30. execvp(parsedArguments[0],parsedArguments);
  31. return
  32. }
  33. else{
  34. return;
  35. }
  36. }
  37. }
  38.  
  39.  
  40.  
  41. int Parse(char line[], char *parsedArguments[]) //Parsing
  42. {
  43. int i=0;
  44. if((parsedArguments[i] = strtok(line," "))==NULL){
  45. printf("Please enter Command ");
  46. return 0;
  47. }
  48. int counter=1;
  49. while((parsedArguments[counter] = strtok(NULL, " ")) != NULL){ //Parse Using Spaces
  50. i++;
  51. }
  52. parsedArguments[i]= '\0';
  53. return i;
  54. }
  55. int ExecuteProcess(char *parsedArguments[]){
  56. pid_t pid = fork();
  57. if(pid==-1){
  58. printf("\nFailed Fork");
  59. return ;
  60. }
  61. else if(pid==0) {
  62. if(execvp(parsedArguments[0],parsedArguments)<0){
  63. printf("Could not Execute Command");
  64. }
  65. exit(0);
  66. }
  67. else{
  68. wait(NULL);
  69. }
  70. }
  71. int main()
  72. {
  73. char line[MAX]; // User Input
  74. char *parsedArguemnt[ARGS]; // Arguments in Command (tokens)
  75. int tokenCount=0;
  76. int status;
  77. int flag=1;
  78.  
  79. struct sigaction sa;//Child Signal
  80.  
  81. sa.sa_handler = signalHandler; // to call my signal handling functions
  82. sigemptyset(&sa.sa_mask); //set sa with zeros
  83. sigaction(SIGCHLD,&sa,NULL);//call my signal handler when a child terinates
  84. printf("Simple Shell");
  85. while(1)
  86. {
  87. printf("\n>>");
  88. fgets(line, MAXLINE, stdin);//Read Input from User
  89. tokenCount=Parse(line,parsedArguemnt);//Parsing Input
  90. if(strcmp(parsedArguemnt[0],"exit") == 0){ //Exit Function
  91. exit(0);
  92. }
  93. if(flag==1){
  94. ExecuteProcess(parsedArguemnt);
  95. }
  96. else{
  97. ExecuteBackground(parsedArguemnt);
  98. }
  99. }
  100.  
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement