Nicht angemeldet. · Kennwort vergessen · Registrieren

pm
Mitglied seit 02/2011
7 Beiträge
Betreff: Juli2009 Backup
Zu dieser Aufgabe hätte ich ein paar Fragen: (siehe Kommentare)

  1. int main(int argc, char*argv[]){
  2.  
  3.     DIR* dp = opendir('.');
  4.     struct dirent *ent;
  5.     struct stat attribute;
  6.  
  7.     if(dp == NUll){
  8.         fprintf(stderr, "opendir: %s: %s\n",'.', strerror(errno));
  9.         return exit(EXIT_FAILURE);
  10.     }
  11.    
  12.     while(errno=0, (ent = readdir(dp))!=NULL)){
  13.  
  14.         char *pfad[1+strlen((*ent).d_name) +1+1]; //  kann ich das weglassen, weil ich nur das aktuelle Verzeichnis durchsuche?
  15.         strcpy(pfad,'.');
  16.         strcat(pfad, '/');
  17.         strcat(pfad, (*ent).d_name);
  18.  
  19.         if(stat(pfad,&attribute)==-1){              // und hier(stat((*ent.).d_name, &attribute) schreiben?
  20.             fprintf(stderr,"stat %s %s",pfad, strerror(errno));
  21.             continue;
  22.         }
  23.  
  24.         if(((*ent).d_name) != '.'&& I_ISREG(attribute.st_mode)){
  25.  
  26.             pid_t p= fork();
  27.             if(p==(pid_t)0){
  28.                 execvp("/usr/bin/backup", pfad); //hier dann auch statt pfad auch (*ent.).d_name?
  29.                 fprintf( stderr, "backup %s", pfad);
  30.                         perror("execvp");
  31.                         exit(EXIT_FAILURE);
  32.             }else{ if(p!= (pid_t)-1){
  33.                 int status;
  34.                 wait(&status);// Durchsuchung wird fortgesetzt, muss ich angeben wie das Kind terminiert ist?
  35.                 }else{
  36.                 fprintf(stderr,"fork %s", sterror(errno));
  37.                 }
  38.             }
  39.     }
  40.  
  41.     if(errno !=0){
  42.         perror("readdir");
  43.     }
  44.  
  45.     closedir(dp);
  46. }

Was muss ich bei der Aufgabenstellung "Fehler beim Sichern einzelner Dateien sollen nicht zum Abbruch des Programms führen?" beachten?
Dieser Beitrag wurde 2 mal verändert, zuletzt am 03.08.2011, 00:38 von dom.
Begründung: Code tags hinzugefügt
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Bitte den Code in zukunft mit [code=c] ... [/code] formatieren.

  • Fehlermeldungen am besten immer direkt nach dem Befehl machen. Das erleichtert uns das Korrigieren, und verhindert, dass ihr aus versehen Punkte abgezogen bekommt.
  • Weglassen: Ja
  • Du machst überflüssige stats auf Datein, die mit . beginngn.
  • execvp: nochmal anschauen
  • else if ging in dem Fall auch
  • Terminierung: Steht das in der Aufgabenstellung?
  • Aufgabenstellung: z.B. Das der Rückgabewert von backup nicht ausgewertet werden muss....
pm
Mitglied seit 02/2011
7 Beiträge
neuer Versuch:

  1. int main(int argc, char*argv[]){
  2.  
  3.     DIR* dp = opendir('.');
  4.     struct dirent *ent;
  5.     struct stat attribute;
  6.  
  7.     if(dp == NULL){
  8.         fprintf(stderr, "opendir: %s: %s\n",'.', strerror(errno));
  9.         return exit(EXIT_FAILURE);
  10.     }
  11.    
  12.     while(errno=0, (ent = readdir(dp))!=NULL)){
  13.  
  14.      if(((*ent).d_name) != '.'){
  15.  
  16.         if(stat((*ent.).d_name,&attribute)==-1){             
  17.             fprintf(stderr,"stat %s %s",(*ent.).d_name, strerror(errno));
  18.                     continue;
  19.             }
  20.  
  21.         if(I_ISREG(attribute.st_mode)){
  22.                    
  23.             pid_t p= fork();
  24.  
  25.             if(p==(pid_t)0){
  26.                 execvp("/usr/bin/backup", (*ent.).d_name);
  27.                 fprintf( stderr, "backup %s", (*ent.).d_name);
  28.                 perror("execvp");
  29.                 exit(EXIT_FAILURE);
  30.                 }else{if(p!= (pid_t)-1){
  31.                         int status;
  32.                         wait(&status);
  33.                       }else{
  34.                         fprintf(stderr,"fork %s", sterror(errno));
  35.                         }         
  36.                     }
  37.            }
  38.         }
  39.     }
  40.  
  41.     if(errno !=0){
  42.         perror("readdir");
  43.     }
  44.  
  45.     closedir(dp);
  46. }

Mit dem execvp komme ich immer noch nicht klar: Als erstes Argument wird doch der Programmname übergeben, das ist doch "/usr/bin/backup", oder? Als 2. einen Zeiger auf das ganze Feld? Dieses müsste ich aber erst noch mit strtok erzeugen? Ist es deshalb besser, wenn ich execl("/usr/bin/backup", &(*ent.).d_name) verwende?
Dieser Beitrag wurde 2 mal verändert, zuletzt am 02.08.2011, 13:47 von pm.
holzblock
Mitglied seit 10/2010
21 Beiträge
Dumme Frage: Wo finde ich diese Aufgabe?? Hab hier die Klausur vom Juli 2009 vor mir liegen aber da ist die Programmieraufgabe "Tankkontrolle"?
pm
Mitglied seit 02/2011
7 Beiträge
Es ist die Aufgabe 2b bei der Klausur von den Mechatronikern. Tankkontrolle ist die 2a.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Antwort auf Beitrag #3
Zitat von pm:
Mit dem execvp komme ich immer noch nicht klar: Als erstes Argument wird doch der Programmname übergeben, das ist doch "/usr/bin/backup", oder? Als 2. einen Zeiger auf das ganze Feld? Dieses müsste ich aber erst noch mit strtok erzeugen? Ist es deshalb besser, wenn ich execl("/usr/bin/backup", &(*ent.).d_name) verwende?

Jep in dem Fall ist wohl execl einfacher. Allerdings solltest du dir übungsfolien dazu nochmal anschauen....
pm
Mitglied seit 02/2011
7 Beiträge
ich habe es mir nochmals angeschaut und verstehe es so:
execl("/usr/bin/backup", (*ent).d_name; NULL); oder
execvp("/usr/bin/backup/",strt); wobei str ein array ist, in dem das Kommando und der Name steht? dieses müsste ich mit strtok zusammenbauen....
Habe ich das jetzt richtig verstanden?
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von pm:
Habe ich das jetzt richtig verstanden?
Nope. -> Nochmal die Folien genau(!) studieren.....
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen