2017-01-25 3 views
1

Ich habe ein Problem mit dem Erstellen eines Verzeichnisses innerhalb eines Linux-Kernel-Moduls.Linux Kernel Modul - Verzeichnis erstellen

Was ich will: Erstellen eines Verzeichnisses innerhalb eines Kernel-Moduls.

Hier ist mein eigentlicher Code:

struct file *fp = (struct file *) NULL; 
fp = filp_open("/home/testdir", O_DIRECTORY|O_CREAT, S_IRUSR); 

Aber es wird eine Datei erstellt, anstatt Verzeichnis.

versuchte ich zu gleichen Code wie oben, ohne das Flag „O_DIRECTORY“:

struct file *fp = (struct file *) NULL; 
fp = filp_open("/home/testdir", O_CREAT, S_IRUSR); 

Und das Ergebnis ist ähnlich dem vorherigen Ergebnis.

Ich verstehe das Verhalten nicht. Was mache ich falsch?

Edit 1: Ich entwickle auf einer Raspberry PI, Raspbian, Kernel-Version: 4.4.43-v7

+0

Vielleicht bedeutet 'O_DIRECTORY', irgendwelche übergeordneten Verzeichnisse zu erstellen, haben Sie versucht,' 'home/testdir/delete-this' '? Wenn es funktioniert, verwenden Sie die falsche Funktion. Oh, das ist nur eine wilde Vermutung. Ich habe keine Ahnung, was 'filp_open()' ist oder tut. –

+0

Das funktioniert nicht, aber danke für den Versuch! Es erstellt nicht die Verzeichnisse "testdir" oder "delete-this" –

+0

Warum verwenden Sie 'mkdir()' nicht? und dieser Aufruf sollte nach dem Mann scheitern, nicht überprüfen Sie den Rückgabewert? ["Wenn Pfadname kein Verzeichnis ist, verursacht das Öffnen fehlgeschlagen."] (Http://rz2.com/man2/open.2.html). Übrigens ist dies nutzlos, um 'NULL' zu erzeugen, und dies ist nutzlos, um Ihre Variable auf' NULL' zu initialisieren, wenn Sie es unmittelbar danach beeinflussen. Das ist schlechte Praxis. – Stargateur

Antwort

0

Dies kein Verzeichnis nicht erstellen, sondern ein Verzeichnis wie opendir öffnet tut (das Verzeichnis sollte vorhanden) .

+0

Also funktioniert die Kombination "O_DIRECTORY | O_CREAT" nicht? –

+0

Genau, filp_open funktioniert wie open und du kannst keine Verzeichnisse mit open erstellen. –

+0

Ich habe die Lösung. :-) –

3

Ich habe es selbst. Die Lösung ist:

struct file *fp = (struct file *) NULL; 
fp = filp_open("/home/testdir/", O_DIRECTORY|O_CREAT, S_IRUSR); 

Notiere die „/“ am Ende des Weges.

Danke @all für den Versuch!