Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. /*
  2. Shell-Beispielimplementierung
  3.  
  4. Die Implementierung verzichtet aus Gründen der Einfachheit
  5. des Parsers auf eine vernünftige Heap-Speicherverwaltung:
  6.  
  7. Falls der Parser die Analyse eines Kommandos wegen eines
  8. Syntaxfehlers abbricht, werden die ggf. vorhandenen
  9. Syntaxbäume für erfolgreich analysierte Unterstrukturen des
  10. fehlerhaften Kommandos nicht gelöscht.
  11.  
  12. Beispiel: if test ! -d /tmp; then mkdir /tmp; else echo "/tmp vorhanden" fi
  13.  
  14. Die Analyse wird mit Fehlermeldung abgebrochen, weil vor dem "fi" das
  15. obligatorische Semikolon fehlt. Im Heap stehen zu diesem Zeitpunkt die
  16. Bäume für das test- und das mkdir-Kommando. Diese verbleiben als Müll
  17. im Heap, da die Verweise ausschließlich auf dem Parser-Stack stehen,
  18. der im Fehlerfall nicht mehr ohne weiteres zugänglich ist.
  19.  
  20. Um dies zu beheben, müsste man
  21. a) sich beim Parsen die Zeiger auf die Wurzeln aller
  22. konstruierten Substruktur-Bäume solange in einer globalen Liste merken,
  23. bis die Analyse der kompletten Struktur ERFOLGREICH beendet ist
  24. oder
  25. b) die Grammatik mit Fehlerregeln anreichern, in denen die Freigabe
  26. im Fehlerfall explizit vorgenommen wird.
  27.  
  28. Da beides die Grammatik aber stark aufbläht, wird darauf verzichtet.
  29. */
  30.  
  31. #include <unistd.h>
  32. #include <stdlib.h>
  33. #include <string.h>
  34. #include <stdio.h>
  35. #include <unistd.h>
  36. #include <signal.h>
  37. #include <sys/types.h>
  38. #include <sys/wait.h>
  39.  
  40. #include "utils.h"
  41. #include "listen.h"
  42. #include "wortspeicher.h"
  43. #include "kommandos.h"
  44. #include "frontend.h"
  45. #include "parser.h"
  46. #include "variablen.h"
  47.  
  48. extern int yydebug;
  49. extern int yyparse(void);
  50. extern int interpretiere(Kommando k, int forkexec);
  51.  
  52. int shellpid;
  53.  
  54. void endesubprozess (int sig){
  55.  
  56. }
  57.  
  58. void init_signalbehandlung(){
  59.  
  60. }
  61.  
  62. void sigfunc(int sig) {
  63. fputs("Use Exit for Exit\n", stderr);
  64. fputs("$bshell> ", stderr);
  65. }
  66. int main(int argc, char *argv[]){
  67. int zeigen=0, ausfuehren=1;
  68. int status, i;
  69. signal(SIGINT, sigfunc);
  70. init_signalbehandlung();
  71.  
  72. yydebug=0;
  73.  
  74. for(i=1; i<argc; i++){
  75. if (!strcmp(argv[i],"--zeige"))
  76. zeigen=1;
  77. else if (!strcmp(argv[i],"--noexec"))
  78. ausfuehren=0;
  79. else if (!strcmp(argv[i],"--yydebug"))
  80. yydebug=1;
  81. else {
  82. fprintf(stderr, "Aufruf: %s [--zeige] [--noexec] [--yydebug]\n", argv[0]);
  83. exit(1);
  84. }
  85. }
  86.  
  87. wsp=wortspeicherNeu();
  88.  
  89. while(1){
  90. int res;
  91. fputs("$bshell> ", stdout);
  92. fflush(stdout);
  93. res=yyparse();
  94. signal(SIGINT,init_signalbehandlung);
  95. if(res==0){
  96. if(zeigen)
  97. kommandoZeigen(k);
  98. if(ausfuehren)
  99. status=interpretiere(k, 1);
  100. if(zeigen)
  101. fprintf(stderr, "Status: %d\n", status);
  102. kommandoLoeschen(k);
  103. }
  104. else
  105. fputs("Fehlerhaftes Kommando\n", stderr);
  106. wortspeicherLeeren(wsp);
  107. }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement