Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » Probleme mit der stat() Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
02.09.2003, 13:41 Uhr
virtual
Sexiest Bit alive
(Operator)


stat funktioniert in der Regel immer ohne Abstürze, egal was man stat-tet und ob das Ding da ist. Ich nehme eher an, daß Deine Parameter ungültig sind;
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
02.09.2003, 13:44 Uhr
typecast
aka loddab
(Operator)


Also der string enthählt das was er enthalten soll. Und sb ist einfach nur das struct stat. Damit habe ich bis zu dem Aufruf nichts getan. Außerdem tritt der Fehler nur auf, wenn das Verzeichniss nicht existiert. Ich habe den Fehler nur gefunden, als ich mal testen wollte, ob das auch mit Verzeichnissen funktioniert, die nicht existieren
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 02.09.2003 um 13:46 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
02.09.2003, 14:21 Uhr
Pablo
Supertux
(Operator)



Zitat:
Loddab postete


C++:
        if (stat(path, sb) == -1) // <-- hier kommt der Seg Fault
        {
                fprintf(stderr, "Es trat der Fehler %s auf", errno);
                ...
        }




Könnte es sein, das sb kein Pointer ist??????


C++:
#include <sys/types.h>
#include <sys/stat.h>

int stat(const char* pfadname, struct stat* puffer);
int fstat(int fd, struct stat* puffer);
int lstat(const char* pfadname, struct stat* puffer);



Vielleicht musst du richtig sb deklarieren: (@virtual hat darauf hingewiesen)

C++:
strcut stat* sb = NULL; // oder uch ohne = NULL
...
if (stat(path, sb) == -1)



oder

C++:
strcut stat sb;
...
if (stat(path, &sb) == -1)


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 02.09.2003 um 14:21 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
02.09.2003, 14:24 Uhr
ao

(Operator)



Zitat:
Loddab postete

C++:
        if (stat(path, sb) == -1) // <-- hier kommt der Seg Fault
        {
                fprintf(stderr, "Es trat der Fehler %s auf", errno);
                ...
        }




Aaaarghhhh! errno ist kein char *, sondern ein int!
Schreibs mal so:

fprintf(stderr, "Es trat der Fehler %d auf", errno);

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
02.09.2003, 14:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich hab mal schnell was gebaut :D. Das beweist, daß es ziemlich wurscht ist, was man dem Stat übergibt.

C++:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>

int main(int argc, char** argv)
{
    int i, j;
    struct stat sb;
    int returncode = EXIT_SUCCESS;

    for(i=1; i<argc; ++i)
    {
        char p[] = "---------";
        struct passwd* pw;
        struct group* gr;

        /*
         * Fetch information
         */

        if (0 != stat(argv[i], &sb))
        {
            fprintf(stderr, "stat(\"%s\",...) failed: %s (%d)\n",
                    argv[i], strerror(errno), errno);
            returncode = EXIT_FAILURE;
            continue;
        }

        /*
         * Print information
         */

        printf("File information for \"%s\":\n", argv[i]);
        printf("\tDevice:          %d/%d\n", (unsigned)sb.st_dev/256, (unsigned)sb.st_dev%256);
        printf("\tINode:           %ld\n", sb.st_ino);
        printf("\tType:            ");
        switch (sb.st_mode&S_IFMT)
        {
        case S_IFSOCK: puts("socket file"); break;
        case S_IFLNK: puts("siymbolic link"); break;
        case S_IFREG: puts("regular file"); break;
        case S_IFBLK: puts("block device"); break;
        case S_IFCHR: puts("character device"); break;
        case S_IFDIR: puts("directory"); break;
        case S_IFIFO: puts("named pipe"); break;
        default: puts("*** dont know ***"); break;
        }
        /* Just a golf joke */
        for(j=0; j<12; ++j) p[8-(j<9?j:(j-9)*3)] += (sb.st_mode&1<<j?(j<9?69+(j%3?((j+1)%3?5:0):6):p[8-3*(j-9)]!='-'?(j==9?-4:-5):(j==9?39:38)):0);
        printf("\tMode:            %o (%s)\n", 07777&sb.st_mode, p);
        printf("\tNumber of Links: %d\n", sb.st_nlink);
        pw = getpwuid(sb.st_uid);
        printf("\tOwning user:     %s (%d)\n", pw? pw->pw_name:"???", sb.st_uid);
        gr = getgrgid(sb.st_gid);
        printf("\tOwning group:    %s (%d)\n", gr? gr->gr_name:"???", sb.st_gid);
        if ((sb.st_mode&S_IFMT)==S_IFCHR || (sb.st_mode&S_IFMT)==S_IFBLK)
        {
            printf("\tDevice type:      %d/%d\n", (unsigned)sb.st_rdev/256, (unsigned)sb.st_rdev%256);
        }
        printf("\tSize (bytes):    %ld\n", sb.st_size);
        printf("\tBytes per block: %ld\n", sb.st_blksize);
        printf("\tSize (blocks):   %ld\n", sb.st_blocks/(sb.st_blksize/512));
        printf("\tAccess time:     %s", ctime(&sb.st_atime));
        printf("\tModify time:     %s", ctime(&sb.st_mtime));
        printf("\tCreation time:   %s", ctime(&sb.st_ctime));
    }
    return returncode;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 02.09.2003 um 14:31 Uhr von urform editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
02.09.2003, 14:25 Uhr
typecast
aka loddab
(Operator)


Am Anfang hatte ich

C++:
struct stat* sb;


dann habe ich es mit

C++:
struct stat sb;
if (stat(path, &sb) == -1)
...



versucht (siehe Post 007). Aber da hat alles nicht funktioniert.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
02.09.2003, 14:31 Uhr
ao

(Operator)



Zitat:
Loddab postete
Am Anfang hatte ich

C++:
struct stat* sb;


dann habe ich es mit

C++:
struct stat sb;
if (stat(path, &sb) == -1)
...



versucht (siehe Post 007). Aber da hat alles nicht funktioniert.



Das erste kann nicht funktionieren (Pointer ohne Speicher dahinter). Dass das zweite nicht gehen soll, wundert mich ein bisschen. Aber hast du mein Posting gelesen, das über deinem länglichen Sourcecode steht (eine Minute vorher angepinnt)? In dem fprintf war auch noch was falsch.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
02.09.2003, 14:46 Uhr
typecast
aka loddab
(Operator)


@ao: Danke ja daran lag es. Ich wollte meine Debug-Meldung vor das fprint() setzten, muss aber außversehen die mittlere Maustaste eine Zeile darunter gedrückt haben. Deshalb bin ich davon ausgegangen, dass der Fehler bei stat() liegt.

Stimmt es den jetzt, dass Verzeichnisse nur spezielle Dateien sind, oder handelt es sich dabei um etwas anderes?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
02.09.2003, 14:56 Uhr
Pablo
Supertux
(Operator)


Es darf nicht wahr sein, das habe ich gar nicht mehr mehr gelesen, was in der fprintf Anweisung stand.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
02.09.2003, 15:13 Uhr
virtual
Sexiest Bit alive
(Operator)


@loddab
Alles, was Du mit ls listen kannst, sind dateien. Siehe mein vorheriges post.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: