Wie kann ich die PID des Benutzerprozesses abrufen, der meine Kernel-Module ausgelöst hat? file_operation.read
Routine (d. h. welcher Prozess liest /dev/mydev
) ?
Benutzerprozess-PID beim Schreiben des Linux-Kernel-Moduls erhalten
Wenn Ihre Lesefunktion ausgeführt wird, geschieht dies im Kontext des Prozesses, der den Systemaufruf ausgegeben hat. Sie sollten daher pe in der Lage sein, zu verwenden current
dh current->pid
.
-
was ist aktuell? read bekommt keinen Strom als Argument… ssize_t(*read) (struct file *, char __user *, size_t, loff_t *);
– 0x90
11. August 2012 um 15:30 Uhr
Heutzutage haben wir einige Hilfsfunktionen in sched.h definiert. Im Fall von pid können Sie Folgendes verwenden:
pid = task_pid_nr(current);
um die PID der aktuellen Aufgabe zu erhalten.
hier ist der kommentar entnommen include/linux/sched.h
ab v3.8.
die Helfer, um die verschiedenen PIDs der Aufgabe zu erhalten, wie sie von verschiedenen Namensräumen gesehen werden
- task_xid_nr() : globale ID, dh die ID, die aus dem Init-Namensraum gesehen wird;
- task_xid_vnr() : Virtuelle ID, dh die ID, die aus dem aktuellen PID-Namensraum gesehen wird.
- task_xid_nr_ns() : ID gesehen von den angegebenen ns;
- set_task_vxid() : weist einer Aufgabe eine virtuelle ID zu;
siehe auch pid_nr() etc in include/linux/pid.h
Auf einem Arm-Build von Kernel 2.6.39, wenn current->pid
nicht funktioniert, dann kann es getan werden durch:
pid_nr(get_task_pid(current, PIDTYPE_PID))
Das PIDTYPE_PID
kann ersetzt werden durch PIDTYPE_PGID
oder PIDTYPE_SID
. Die Header-Quelle ist bei include/linux/pid.h
wie Yasushi betonte.
Welcher der Ansätze funktioniert, hängt davon ab, welche Header-Dateien der Code verwendet.