kernel Programmierung sys_creat

Diskutiere kernel Programmierung sys_creat im Programmieren allgemein Forum im Bereich Programmieren unter Linux/Unix; Hallo zusammen Kurz zu meiner Person Mein Name ist Andre, ich bin 27 und bin eigentlich Aquarianer :) Ich arbeite mich grade ein wenig in...

  1. #1 soundofakira, 15.05.2012
    soundofakira

    soundofakira Grünschnabel

    Dabei seit:
    15.05.2012
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo zusammen

    Kurz zu meiner Person
    Mein Name ist Andre, ich bin 27 und bin eigentlich Aquarianer :)

    Ich arbeite mich grade ein wenig in die Kernel Programmierung ein und möchte ein wenig darüber lernen.

    Mein erstes Problem, welches ich probieren möchte ist:

    Ich möchte in die Kernel.log einen Eintrag schreiben lassen, wann immer eine neue Datei im System erstellt wird.

    Ich habe mich jetzt ein wenig durch die syscalls gewühlt und habe rausgefunden, dass sys_creat zur Erstellung einer neuen Datei genutzt wird.
    Sys_create ruft wiederum sys_open auf mit dem Flag O_Creat, wenn die Datei erstellt wird

    Richtig soweit?

    Jetzt stehe ich aber ein wenig vor dem Berg

    Ist diese Funktion in fs/open.c zu finden?

    Ich haber dort folgendes gefunden:

    Code:
    if (flags & O_CREAT) {
    		op->intent |= LOOKUP_CREATE;
    		if (flags & O_EXCL)
    			op->intent |= LOOKUP_EXCL;
    	}
    
    	if (flags & O_DIRECTORY)
    		lookup_flags |= LOOKUP_DIRECTORY;
    	if (!(flags & O_NOFOLLOW))
    		lookup_flags |= LOOKUP_FOLLOW;
    	return lookup_flags;
    }
    
    /**
     * filp_open - open file and return file pointer
     *
     * @filename:	path to open
     * @flags:	open flags as per the open(2) second argument
     * @mode:	mode for the new file if O_CREAT is set, else ignored
    Ich nehme mal an, dass ich also entsprechend unter
    Code:
    if (flags & O_CREAT) {
    		op->intent |= LOOKUP_CREATE;
    meinen Hinweis für den Kernel habe, dass es sich beim Aufruf der Funktion um eine neue Datei handelt die erstellt wird. (Flag O_Create)

    Wenn dem so ist.. wie geht es denn dann weiter?
    Da steige ich grade noch nicht so richtig hinter.

    Wäre super, wenn mir da jemand helfen kann :)

    gruß
    Andre
    gruß
    Andre
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 soundofakira, 17.05.2012
    soundofakira

    soundofakira Grünschnabel

    Dabei seit:
    15.05.2012
    Beiträge:
    5
    Zustimmungen:
    0
    So ich bin jetzt doch ein Stück weiter gekommen

    Die sys_open wird auf die

    do_sys_open Funktion gemapped (fs/open.c - Zeile 974)

    Code:
    long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
    {	
    
    	struct open_flags op;
    	int lookup = build_open_flags(flags, mode, &op);
    	char *tmp = getname(filename);
    	int fd = PTR_ERR(tmp);
    
    	if (!IS_ERR(tmp)) {
    		fd = get_unused_fd_flags(flags);
    		if (fd >= 0) {
    			struct file *f = do_filp_open(dfd, tmp, &op, lookup);
    			if (IS_ERR(f)) {
    				put_unused_fd(fd);
    				fd = PTR_ERR(f);
    			} else {
    				fsnotify_open(f);
    				fd_install(fd, f);
    			}
    		}
    		putname(tmp);
    	}
    	return fd;
    }
    Was ich jetzt machen müsste, wäre es die aktuelle Systemzeit abzugreifen und eine Ausgabe zu machen

    Dies habe ich so implementiert
    Code:
    long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
    {	
    //Abfragen der aktuellen Systemzeit
    	time_t zeit;
    	time(&zeit);
    	//Die Systemzeit wird in einem Chararray unbekannter Größe gespeichert
    	char[] zeitpunkt = asctime(localtime(&zeit));
    	
    	struct open_flags op;
    	int lookup = build_open_flags(flags, mode, &op);
    	char *tmp = getname(filename);
    	int fd = PTR_ERR(tmp);
    
    	if (!IS_ERR(tmp)) {
    		fd = get_unused_fd_flags(flags);
    		if (fd >= 0) {
    			struct file *f = do_filp_open(dfd, tmp, &op, lookup);
    			if (IS_ERR(f)) {
    				put_unused_fd(fd);
    				fd = PTR_ERR(f);
    			} else {
    				fsnotify_open(f);
    				fd_install(fd, f);
    				printk(KERN_INFO "Hier wurde eine neue Datei erstellt: %s %s",*tmp, zeitpunkt);
    			}
    		}
    		putname(tmp);
    	}
    	return fd;
    }
    Sollte so funktionieren oder?
     
Thema:

kernel Programmierung sys_creat

Die Seite wird geladen...

kernel Programmierung sys_creat - Ähnliche Themen

  1. Kernelprogrammierung: geöffnete Terminals modifizieren

    Kernelprogrammierung: geöffnete Terminals modifizieren: Guten Abend! Ich habe mal vor einigen Montaten das Kernelmodul 'vlogger' für den 2.6er-Kernel umgeschrieben...
  2. Gigabit PCI Ethernet Card welche unter Kernel 3.16 läuft?

    Gigabit PCI Ethernet Card welche unter Kernel 3.16 läuft?: Hallo zusammen Bezüglich diesem Problem habe ich nun eine neue PCI Gigabit Ethernet Card gekauft, jedoch zeigt mit lspci REIN GAR NIX an!! ->...
  3. OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren

    OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren: Hallo zusammen Habe vor das OpenJDK8 unter Debian 7.11 (mit Kernel 3.16.x aus wheezy-backports...) auf meiner Sun Ultra 45 zu kompilieren....
  4. Neuer Kernel-Zweig nur für Sicherheitskorrekturen

    Neuer Kernel-Zweig nur für Sicherheitskorrekturen: Sasha Levin von Oracle hat angekündigt, von den stabilen Kernel-Versionen eigene Versionen pflegen zu wollen, die bis auf Sicherheitskorrekturen...
  5. Linux-Kernel 4.6 tritt in die Testphase ein

    Linux-Kernel 4.6 tritt in die Testphase ein: Linux-Initiator Linus Torvalds hat die Kernel-Version 4.6-rc1 als erste Testversion für Linux 4.6 freigegeben. Die Verbesserungen ziehen sich...