2016-03-27 16 views
0

Also mache ich ein sehr einfaches Programm, das die Eigenschaften einer Datei auf einem UNIX-System ausgibt.Ausdruck st_uid in C Programmierung

Ich habe Stat() verwendet, um dies zu tun.

Allerdings habe ich ein wenig Probleme beim Ausdrucken des Benutzers und der Gruppe für die Datei. Alles andere scheint in Ordnung zu sein.

Dies ist ein kleiner Ausschnitt aus meinem Code (bereits erklärt, die struct):

stat(dir_pointer->d_name, &buf); 
printf("%o %s\n", buf.st_nlink, buf.st_uid); 

Es mir einen Segmentation Fault ich diesen spezifischen Teil meines Code ausführen jedes Mal gibt. Wäre der Benutzer und die Gruppe als String gekennzeichnet?

EDIT 1:

struct stat buf; // struct for stat 
+0

Zeigen, wie buf deklariert ist. –

+1

'buf' ist höchstwahrscheinlich ein' struct stat', es sei denn, Sie verwenden einen beschissenen Compiler, der anderen Code erlaubt. Sie übergeben jedoch "buf.st_uid" vom Typ "uid_t" an "printf" und geben an, dass es sich um eine Zeichenfolge ("% s") handelt. Das ist wahrscheinlich der Grund für deine "SIGSEGV". – 3442

+0

Vielen Dank für Ihre Eingabe, ist es möglich, den Typ 'uid_t' in einen String zu ändern, so dass er auf 'stdout' ausgegeben werden kann? – Yozuru

Antwort

2

Das st_uid Mitglied struct stat eine ganze Zahl von Typ uid_t, die unsigned short oder unsigned int typischerweise identisch ist. Es enthält die numerische UID, keinen Benutzernamen.

Wenn Sie die numerische uid drucken möchten, müssen Sie es zunächst auf eine gut definierte Integer-Typ werfen, und verwenden Sie das richtige Format Descriptor mit printf:

printf("%ld\n", (long)buf.st_uid); 

Wenn auf der anderen Seite möchten, können Sie den zugehörigen Benutzernamen drucken, müssen Sie getpwuid die Funktion verwenden, um die Konvertierung durchzuführen:

struct passwd *pwd; 
pwd = getpwuid(buf.st_uid); 
if(pwd == NULL) { 
    perror("getpwuid"); 
} else { 
    printf("%s\n", pwd->pw_name); 
} 

Beachten Sie, dass getpwuid gibt einen Zeiger auf einen statischen Puffer, müssen ihre, so dass Sie eine Kopie speichern von Wert, wenn Sie es wiederverwenden wollen l Ater.

+0

Ich sehe! Also muss ich es zuerst übertragen und dann kann ich es ausdrucken. Danke für die gut geschriebene Antwort. – Yozuru

1

In dieser Zeile ...

printf("%o %s\n", buf.st_nlink, buf.st_uid); 

Dies geschieht mehr oder weniger:

Sie: Hey, printf()!

printf(): Ja?

Sie: Zunächst gebe ich Ihnen eine int, und Sie sollten es in Oktal drucken. Dann sollten Sie die Zeichenfolge " " drucken. Als nächstes gebe ich Ihnen eine Zeichenfolge, dh eine const char*, und Sie sollten es ausdrucken. Drucken Sie zuletzt die Zeichenfolge "\n".

printf(): Ich verstehe. Gib mir das erste Argument.

Sie: buf.st_nlink.

printf(): Nun, die zweite.

Sie: buf.st_uid. Das hat eigentlich Typ uid_t aber printf() weiß das nicht. Groß!

printf() versucht, auf Speicher unter Adresse 0x03E8 zuzugreifen. A page fault tritt auf.

Kernel: Hey, was ist dort los? Einige nette interrupt handler sagte mir, dass Sie auf ungültige Adressen zugreifen. Sie scheinen keinen Handler für SIGSEGV zu haben. Es tut mir leid, aber Sie, PID 1223, werden durch SIGSEGV beendet. Das nächste Mal, sagen Sie Nein zu Drogen.

Mit anderen Worten, überprüfen Sie, dass Sie das Zeug dazu, die richtigen Typen zu printf() jedes Mal, wenn Sie einen Anruf an sie schreiben vorbei sind.