[Solved] HDD Leds Blinken



  • Theoretisch müsste doch dieses Programm die HDD Led zum blinken bringen,
    aufgrund des Zugriffes. Leider passiert das nicht.

    Hat jemand eine idee ?

    #include <iostream>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    int main(int argc, char* argv[]){
      int fd = open(argv[1],O_NONBLOCK | O_RDONLY | O_DIRECT | O_SYNC );
      if(fd<0){
        std::cerr << "Can't open Device" << argv[1] << "\n";
        return -1;
      }
      for(;;){
        lseek (fd, 0, SEEK_SET);
        read(fd,NULL,255);
      }
      return 0;
    }
    


  • O_DIRECT heißt, daß Du nicht read machen willst, sondenr mit ioctl spielen, fürchte ich aus der manpage von open herausgelesen zu haben.



  • Oh danke lese ich auch gerade werde jetzt versuchen die led's direkt anzusteuern.
    Habe die Led's zum blinken bekommen aber läuft nicht gerade zuverlässig.


  • Mod

    Was ist denn der Zweck deines Programms? Die HDD-LED ist (neben der Power-LED) eines der wenigen Lämpchen im (heutigen) PC, die tatsächlich an die Hardware gekoppelt sind. Wenn es nur darum geht, Lämpchen zu steuern, dann bist du mit der Tastatur (oder beispielsweise auch Webcams und anderen Peripheriegeräten, wenn du eine passende Doku findest) besser bedient. Bei der HDD-LED musst du also tatsächlich Festplattenaktivität verursachen. Und zwar so, dass dir da nicht irgendein Cache dazwischen sitzt (oder wenn doch, dann musst dieser eben einen Cache-Miss haben). Vermutlich ist es auch irgendein Cache, der dafür sorgt, dass dein jetziges Programm (wie sieht es momentan eigentlich aus?) nur unzuverlässig funktioniert.



  • Das funktioniert jetzt zuverlässig

    #include <iostream>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    #define BUFLEN 4096
    
    int main(int argc, char* argv[]){
      int fd = open(argv[1],O_NONBLOCK | O_RDONLY | O_SYNC );
      if(fd<0){
        std::cerr << "Can't open Device" << argv[1] << "\n";
        return -1;
      }
      for(;;){
        size_t devlen = lseek(fd, 0L, SEEK_END);
        for(off_t pos=lseek(fd, 0, SEEK_SET); fd<devlen; pos=lseek(fd, BUFLEN, SEEK_CUR)){
          pread(fd,NULL,BUFLEN,pos);
        }
      }
      return 0;
    }
    


  • Es geht um Server und die haben meistens eine Backplane und sehr viele Platten dar die richtige zu finden ist manchmal schwierig.



  • Tuxist schrieb:

    Es geht um Server und die haben meistens eine Backplane und sehr viele Platten dar die richtige zu finden ist manchmal schwierig.

    Ach, dann hätte es auch wohl

    dd if=/dev/sda of=/dev/zero
    

    getan.



  • of=/dev/null ist schöner. Aber macht vermutlich keinen Unterschied.



  • Aber nicht wenn man es in ein Programm einbinden möchte 😉


Anmelden zum Antworten