Not logged in. · Lost password · Register

pm
Member since Feb 2011
7 posts
Subject: 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?
This post was edited 2 times, last on 2011-08-03, 00:38 by dom.
Edit reason: Code tags hinzugefügt
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
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
Member since Feb 2011
7 posts
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?
This post was edited 2 times, last on 2011-08-02, 13:47 by pm.
holzblock
Member since Oct 2010
21 posts
Dumme Frage: Wo finde ich diese Aufgabe?? Hab hier die Klausur vom Juli 2009 vor mir liegen aber da ist die Programmieraufgabe "Tankkontrolle"?
pm
Member since Feb 2011
7 posts
Es ist die Aufgabe 2b bei der Klausur von den Mechatronikern. Tankkontrolle ist die 2a.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #3
Quote by 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
Member since Feb 2011
7 posts
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)
Member since May 2011
331 posts
Quote by pm:
Habe ich das jetzt richtig verstanden?
Nope. -> Nochmal die Folien genau(!) studieren.....
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Special characters:
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen