Szegmens hiba – de miért?

Kezdőlap Fórumok Programozás Szegmens hiba – de miért?

7 bejegyzés megtekintése - 71-77 / 77
  • Szerző
    Bejegyzés
  • #2164588
    gabaman
    Felhasználó

      Lehet, de nem a man-ból vagy info-ból szedtem ki. Viszont tényleg nem árt a man oldalak olvasgatása. Bárcsak mindenkinek ennyire egyértelmű lenne.

      #2164589
      gabaman
      Felhasználó

        Lehet, de nem a man-ból vagy info-ból szedtem ki. Viszont tényleg nem árt a man oldalak olvasgatása. Bárcsak mindenkinek ennyire egyértelmű lenne.

        #2164590
        uzsolt
        Felhasználó

          Én is a man-ból szedtem:

                 The following POSIX macros are defined to check the file type using the st_mode field:
                        S_ISREG(m)  is it a regular file?
                        S_ISDIR(m)  directory?
                        S_ISCHR(m)  character device?
                        S_ISBLK(m)  block device?
                        S_ISFIFO(m) FIFO (named pipe)?
                        S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)
                        S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

          Tény és való, hogy tovább nemigen olvastam…

          #2164591
          uzsolt
          Felhasználó

            Én is a man-ból szedtem:

                   The following POSIX macros are defined to check the file type using the st_mode field:
                          S_ISREG(m)  is it a regular file?
                          S_ISDIR(m)  directory?
                          S_ISCHR(m)  character device?
                          S_ISBLK(m)  block device?
                          S_ISFIFO(m) FIFO (named pipe)?
                          S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)
                          S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

            Tény és való, hogy tovább nemigen olvastam…

            #2164592
            pointux
            Felhasználó

              Igen, ha tovább olvasol, akkor megtalálod a gabaman-féle változatot, ha még a macro is érdekel, akkor megtalálod ezt:

              Code:
              S_…(m) (((m) & S_IFMT) == S_…)

              innentől már csak az a kérdés, hogy egy c nyelv egy break nélküli switch-et, hogyan optimalizál. Gondolom, mintha sima if lenne – egyrészt.
              Másrészt kérdés, hogy a „st->st_mode”-ot hogy kezeli le. Mer elég sok itt a választási lehetőség, hogy megérje ezt a viszonylag nehezen elérhető objektum tagot először átmozgatni egy registerbe (sőt még egy sima lokális memória-területre is) és utána azt vizsgálni.
              A garantáltan leggyorsabb kódot úgy lehet c-ben elérni, hogy egy register változót létrehozunk (ha lehet) és if-fel kezeljük le.

              Code:
              const char *nc_filetype ( struct stat *st ) {
                  register mode_t mode = st->st_mode & S_IFMT;

                  if ( mode == S_IFDIR )
                      return …
                  if ( … )
                      …
              }

              Szerintem ettől gyorsabb kód nincsen. Max., akkor, ha a c nem hajlandó regiszterként kezelni a mode-ot. Akkor írunk egy asm. betétet, ahol az regiszter lesz.

              Persze még mindig ott van, hogy 1) a függvény hívás viszonylag lassú, 2) az adatokat nem konstans időben éred el. Tehát, ha a stringeket egy memória területen helyezed el és a S_IFIFO ( 10000 ) – S_IFSOCK ( 140000 ) /sima bit-eltolást jelentenek ezek/ számokkal (makró segítségével) éred el, valószínű az lesz a sebességre az optimális (méretre nyílván (ha sok helyen kérdezed) nem – arra az előző).

              Ha, már optimalizálunk. 🙂

              #2164593
              pointux
              Felhasználó

                Igen, ha tovább olvasol, akkor megtalálod a gabaman-féle változatot, ha még a macro is érdekel, akkor megtalálod ezt:

                Code:
                S_…(m) (((m) & S_IFMT) == S_…)

                innentől már csak az a kérdés, hogy egy c nyelv egy break nélküli switch-et, hogyan optimalizál. Gondolom, mintha sima if lenne – egyrészt.
                Másrészt kérdés, hogy a „st->st_mode”-ot hogy kezeli le. Mer elég sok itt a választási lehetőség, hogy megérje ezt a viszonylag nehezen elérhető objektum tagot először átmozgatni egy registerbe (sőt még egy sima lokális memória-területre is) és utána azt vizsgálni.
                A garantáltan leggyorsabb kódot úgy lehet c-ben elérni, hogy egy register változót létrehozunk (ha lehet) és if-fel kezeljük le.

                Code:
                const char *nc_filetype ( struct stat *st ) {
                    register mode_t mode = st->st_mode & S_IFMT;

                    if ( mode == S_IFDIR )
                        return …
                    if ( … )
                        …
                }

                Szerintem ettől gyorsabb kód nincsen. Max., akkor, ha a c nem hajlandó regiszterként kezelni a mode-ot. Akkor írunk egy asm. betétet, ahol az regiszter lesz.

                Persze még mindig ott van, hogy 1) a függvény hívás viszonylag lassú, 2) az adatokat nem konstans időben éred el. Tehát, ha a stringeket egy memória területen helyezed el és a S_IFIFO ( 10000 ) – S_IFSOCK ( 140000 ) /sima bit-eltolást jelentenek ezek/ számokkal (makró segítségével) éred el, valószínű az lesz a sebességre az optimális (méretre nyílván (ha sok helyen kérdezed) nem – arra az előző).

                Ha, már optimalizálunk. 🙂

                #1888255
                csaba
                Felhasználó

                  nc.c:

                  Code:
                  #include
                  #include
                  #include
                  #include
                  #include

                  #include „nc.h”
                  int nc_readdir (char *dir , nc_file **files ) {
                      DIR *d_dir;
                      struct dirent *d_file;
                      struct stat prop;
                      int max = 30;
                      /// return value – number of files
                      int nof = -1;

                      d_dir = opendir(dir);
                      if (!d_dir) {
                  #ifdef DEBUG
                          pr_debug(„couldn’t read”);
                  #endif
                          return -1;
                      }

                  #ifdef DEBUG
                      pr_debug(„malloc files”);
                  #endif
                      (*files) = malloc(sizeof(nc_file)*max);
                      if ( (*files) == NULL ) return -1;
                  #ifdef DEBUG
                      pr_debug(„mallocing ok”);
                  #endif

                      d_dir = opendir(dir);
                      while ( (d_file=readdir(d_dir)) != NULL ) {
                          nof++;
                          if ( max == (nof) ) {
                  #ifdef DEBUG
                              pr_debug(„reallocing”);
                  #endif
                              max += 50;
                  #ifdef DEBUG
                              printf(„max = %dn”,max);
                  #endif
                              (*files) = realloc(*files,sizeof(nc_file)*max);
                              if ((*files) == NULL) {
                                  return -1;
                              }
                  #ifdef DEBUG
                              pr_debug(„realloc ok”);
                  #endif
                          }
                  #ifdef DEBUG
                          pr_debug(„strdup”);
                          printf(„%d. %sn”,nof,d_file->d_name);
                  #endif
                          (*files)[nof].name = strdup(d_file->d_name);
                  #ifdef DEBUG
                          pr_debug(„strdup ok”);
                  #endif
                  #ifdef DEBUG
                          pr_debug(„stat”);
                  #endif
                          (*files)[nof].props=malloc(sizeof(stat));
                          stat(nc_strcat(dir,d_file->d_name), (*files)[nof].props);
                  #ifdef DEBUG
                          pr_debug(„stat ok”);
                  #endif
                      }
                      closedir(d_dir);
                      return nof;
                  }

                  nc.h:

                  Code:
                  #include
                  #ifndef NC_H
                  #define NC_H

                  #define pr_debug(msg) printf(„DEBUG: %s %d. %sn”,__FILE__,__LINE__,msg);

                  /// This structure stores the file’s properties.
                  typedef struct nc_file {
                      /// the name of the file
                      char *name;
                      /// the properties (from stat.h)
                      struct stat *props;
                      /// file is selected
                      char selected;
                  } nc_file;

                  /// return value: number of files, -1 if error
                  int nc_readdir (char *dir , nc_file **filesx);
                  /// get string name
                  char *nc_filetype (struct stat *st);

                  #endif

                  Namost ha meghívom az nc_readdir függvényt, az esetek túlnyomó részében szegmens hibával száll el.
                  Amennyire rájöttem, az strdup-sorral kezdődik a probléma, méghozzá mintha nem lenne memória foglalva.
                  Valamint ha /home/zsolt/data paraméterrel hívom az nc_readdir-t, akkor jó. Ha /home/zsolt/data/-val, akkor szegmens hiba.

                  Mi lehet a gond?

                7 bejegyzés megtekintése - 71-77 / 77
                • Be kell jelentkezni a hozzászóláshoz.