Eingabe wird ignoriert



  • Hi Leute,
    ich soll ein Programm schreiben, das 2 Childprozesse erzeugt und diese durch Signale "synchronisiert" werden.
    In der datei 2.c passiert es nun allerdings, dass sämtliche eingaben auf stdin komplett ignoriert werden.(scanf auswahl), zum test hab ich noch ein fgets dahinter gebastelt, wird ebenfalls ignoriert.
    so ich poste mal alle 3 quelldateien:
    main.c

    #include <stdio.h>
    #include <signal.h>
    void nichts();
    int main(int argc, char *argv[]){
      sigset(SIGUSR1, nichts);
      sighold(SIGUSR1);
      char *eargv[3];
      char filename[20];
      if(argc==2){
        strcpy(filename, argv[1]);
      }else{
        printf("Bitte Genau 1 Dateinamen eingeben!\n");
        fgets(filename, sizeof(filename), stdin);
    
      }
      filename[strlen(filename)-1]='\0';
     pid_t pid;
      eargv[2]=NULL;
         eargv[0]=malloc(3);
         eargv[1]=malloc(25);
         strcpy(eargv[0], "1");
         strcpy(eargv[1], filename);
     pid=fork();
     switch(pid){
       case 0:
    
         execv("1", eargv);
         break;
    
     }
     sigpause(SIGUSR1);
     pid=fork();
     if(pid==0){
      strcpy(eargv[0], "2");
      execv("2", eargv);
    
    }
      return 0;
    }
    void nichts(){
      printf("Signal erhalten\n");
      return;
    }
    
    #include <stdio.h>
    #include <signal.h>
    void nichts();
    int main(){
      sigset(SIGUSR2, nichts);
      sighold(SIGUSR2);
        printf("prozess 1 gestartet\n");
        kill(getppid(), SIGUSR1);
      sigpause(SIGUSR2);
        return 0;
    }
    void nichts(){
     printf("Prozess 1: SIGUSR2 erhalten");
      return;
    }
    
    #include <stdio.h>
    #include <signal.h>
    int main(int argc, char *argv[]){
      int auswahl;
      char test[20];
      FILE *fp;
      fp=fopen(argv[1], "rb");
      if(fp==NULL){
        printf("Datei existiert nicht, Datei wird angelegt!\n");
        fp=fopen(argv[1], "wb+");
        fclose(fp);
      }else{
        printf("Datei existiert bereits, soll sie neu angelegt oder fortgesetzt werden? 1-neu 2-fortgesetzt\n");
        scanf("%i", &auswahl);
        fgets(test, sizeof(test), stdin);
        switch(auswahl){
          case 1:fp=fopen(argv[1],"wb+");
          break;
          case 2:fp=fopen(argv[1], "ab");
          break;
        }
      }
    
      return 0;
    }
    

    kA wieso -.-

    der quelltext macht noch keinen großen sinn, hab grad erst angefangen..

    wär schön wenn mal jemand drüber schaut und mir meinen fehler aufzeigen könnte.
    danke schonmal



  • Was soll heißen "wird ignoriert"?
    Teste den Rückgabewert von scanf, dazu ist er da und setze einen default-Zweig bei switch ein. Dann siehst du schon.



  • Der Rückgabewert ist -1.

    Was sagt mir das jetzt?

    lg



  • Ich hab jetzt noch ein bisschen Quelltext hinzugefügt, durch welchen man Text eingeben kann, der anschließend im File gespeichert werden soll.
    Doch auch hier wird meine Texteingabe einfach übersprungen...

    char text[100];
      while(fgets(text, sizeof(text), stdin)!=EOF){
        fwrite(&text, strlen(text),1,fp);
      }
    

    ich dreh bald durch..



  • scanf("%i", &auswahl);
    fgets(test, sizeof(test), stdin);

    Setze zwischen die beiden Zeilen mal ein

    test[0] = '\0';
    

    und nach dem fgets() ein

    printf ("\n%s\n", test);
    

    Dein

    scanf("%i", &auswahl);
    

    interessiert sich ausschließlich für Zahlen/Ziffern und nicht für "whitespace"-Charakter wie newlines (Dein Enter zum Bestätigen der Auswahl).
    Das im Puffer hängende Enter schnappt sich also das folgende fgets() und ist damit auch zufrieden, da die Eingabe durch das Enter selbst auch schon wieder abgeschlossen ist.

    scanf("%i", &auswahl);
    test[0] = '\0';
    fgets(test, sizeof(test), stdin);
    printf ("\nIst hier ein Zeilenumbruch?%sDenkbar...\n", test);
    


  • scanf("%i", &auswahl);
    test[0] = '\0';
    fgets(test, sizeof(test), stdin);
    printf ("\nIst hier ein Zeilenumbruch?%sDenkbar...\n", test);
    

    Bin jetzt etwas skeptisch. Hab es nciht ausprobiert, aber für mich macht es gedanklich keinen Sinn test[0] auf 0 zu setzen um das newline zu entfernen.

    scanf("%i", &auswahl);
    while (getchar() != '\n');
    fgets(test, sizeof(test), stdin);
    printf ("\nIst hier ein Zeilenumbruch?%sDenkbar...\n", test);
    

    Edit: Aso, das hilft allenfalls beim fgets bei scanf kannst du zwar auch mal den stdin vorher leeren. Sollte aber nicht nötig sein, habe keine vorherige Eingabe gesehen.
    OHH, ich lese gerade die FormatSpezifier.... diesmal hoffentlich richtig... laut http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ gibt es - im Gegensatz zu printf - kein aquivalent zu %d durch %i.

    scanf("%d", &auswahl);
    while (getchar() != '\n');
    fgets(test, sizeof(test), stdin);
    printf ("\nIst hier ein Zeilenumbruch?%sDenkbar...\n", test);
    


  • äääähm.
    what?!

    scanf("%i", &auswahl);
    test[0] = '\0';
    fgets(test, sizeof(test), stdin);
    printf ("\nIst hier ein Zeilenumbruch?%sDenkbar...\n", test);
    

    setzt einfach das erste Element der fgets-Zielvariable auf 0, damit man sich später nicht rausreden kann, ein newline wäre schon vorher dringestanden (man hat ja keine Eingabe machen können) 🙂

    Das war alles, was ich loswerden wollte.
    Ob scanf jetzt standardkonform ein %i kennt oder nur %d ist mir ehrlich gesagt gleich 🙂
    Das wurde ja auch vom TE nicht als Problem kommuniziert.
    Ich behaupte, das schlummernde newline ist der Schuldige und die oberen paar Zeilen da könnten das demonstrieren. Zum Beheben des Problems gibts mehrere Ansätze. Zu vermeiden ist davon am dringendsten ein

    fflush(stdin);
    

    (weil Bockmist)



  • fabi1991 schrieb:

    dass sämtliche eingaben auf stdin komplett ignoriert werden.(scanf auswahl), zum test hab ich noch ein fgets dahinter gebastelt, wird ebenfalls ignoriert.

    Berndi schrieb:

    Ob scanf jetzt standardkonform ein %i kennt oder nur %d ist mir ehrlich gesagt gleich 🙂
    Das wurde ja auch vom TE nicht als Problem kommuniziert.

    😉 scanf verursacht ein Problem... oder geht heir was an mir vorbei?

    Zu vermeiden ist davon am dringendsten ein

    fflush(stdin);
    

    (weil Bockmist)

    👍



  • Berndi schrieb:

    setzt einfach das erste Element der fgets-Zielvariable auf 0, damit man sich später nicht rausreden kann, ein newline wäre schon vorher dringestanden (man hat ja keine Eingabe machen können) 🙂

    Schwachfug.



  • DaRe schrieb:

    😉 scanf verursacht ein Problem... oder geht heir was an mir vorbei?

    Scanf verursacht nie ein Problem, das Problem sitzt immer vor dem Bildschirm.



  • Stichwort vorbei. Wann ist dieser Tag endlich vorbei? :xmas2:

    Aber zum Thema scanf...
    Wenn es um Ganzzahlen ("Ziffernfolgen") geht, ist man mit %d als Formatkennzeichen natürlich auf der sicheren Seite.
    Unter Linux kennt scanf() noch %i. Da wird dann je nach "Führung" (0x / 0) hex oder oct gelesen.

    int auswahl = 0;
       char x = '\n';
       int anzahl = 0;
       [...]
       printf ("\nTestweise - auswahl: %d\n", auswahl);
       printf("Datei existiert bereits, soll sie neu angelegt oder fortgesetzt werden? 1-neu 2-fortgesetzt\n");
       do
       {
          anzahl = scanf(" %d ", &auswahl);
          printf ("\nTestweise - anzahl: %d\n", anzahl); // returncode von scanf! Anzahl der erkannten %d bzw. Fehlercode
       }
       while (anzahl != 1); // scanf-Schleife des Todes. Erst bei Eingabe einer Ganzzahl kommst Du hier raus!
       while ((x = getchar()) != EOF && x != '\n'); // schmeißt unerwünschte   newline-Gäste vom stdin-Spielplatz
       printf ("\nTestweise - auswahl: %d\n", auswahl);
       fgets(test, sizeof(test), stdin);
       [...]
    


  • Wutz schrieb:

    Berndi schrieb:

    setzt einfach das erste Element der fgets-Zielvariable auf 0, damit man sich später nicht rausreden kann, ein newline wäre schon vorher dringestanden (man hat ja keine Eingabe machen können) 🙂

    Schwachfug.

    /signed 🙂



  • p3t3r schrieb:

    Unter Linux kennt scanf() noch %i.

    Schwachfug.



  • Wutz schrieb:

    p3t3r schrieb:

    Unter Linux kennt scanf() noch %i.

    Schwachfug.

    http://www.kernel.org/doc/man-pages/online/pages/man3/scanf.3.html
    Hier wird noch ein %i gemäß p3t3rs Beschreibung gelistet.



  • Du scheinst auch Probleme mit der deutschen Sprache zu haben.
    In einem Forum zu C Standards C89/C99 die Aussage zu tätigen
    "Unter Linux kennt scanf() noch %i"
    ist Schwachfug, da %i gemäß beider Standards ein Standard-Spezifizierer für scanf ist und somit "Unter Linux kennt scanf() noch %i" Pfuscher JW Niveau bedeutet (palavert über Standard, hat aber keine Ahnung).



  • %i, %d macht keinen unterschied bei mir. Rückgabewert ist immernoch -1..



  • fabi1991 schrieb:

    %i, %d macht keinen unterschied bei mir. Rückgabewert ist immernoch -1..

    und was gibst du ein?



  • -1 deutet auf einen Fehler bei stdin hin, denn da gibt scanf() EOF zurück.
    Hat evtl. was mit dem fork zu tun.



  • Ich habe das Programm jetzt aufs allergeringste abgespeckt.
    starte ich "2" mit execv("2", vektor) funktioniert alles einwandfrei.
    schreibe ich davor:
    pid=fork();
    if(pid==0)
    execv("2", vektor);

    gibts das Problem.

    ey ich raste gleich aus:(


Anmelden zum Antworten