Wie bekomme ich die PID des Benutzerprozesses, der die file_operation.read
Routine meines Kernmoduls ausgelöst hat (d. H. Welcher Prozess liest /dev/mydev
)?Benutzer Prozess pid beim Schreiben Linux Kernel Modul
Antwort
Wenn Ihre Lesefunktion ausgeführt wird, geschieht dies im Zusammenhang mit dem Prozess, der den Systemaufruf ausgelöst hat. Sie sollten daher current
, d. H. current->pid
, verwenden können.
Heutzutage haben wir einige Hilfsfunktionen in sched.h definiert. Im Fall von PID können Sie verwenden:
pid = task_pid_nr(current);
, um die aktuelle Aufgabe pid.
Hier ist der Kommentar aus include/linux/sched.h
ab v3.8.
die Helfer die Aufgabe der verschiedenen PIDs zu erhalten, wie sie aus verschiedenen Namensräumen
- task_xid_nr() zu sehen sind: global-ID, das heißt der von dem init-Namensraum gesehen id;
- task_xid_vnr(): virtuelle ID, d. H. Die ID aus dem PID-Namespace des aktuellen gesehen.
- task_xid_nr_ns(): id von der angegebenen ns gesehen;
- set_task_vxid(): weist einer Aufgabe eine virtuelle ID zu;
siehe auch pid_nr() usw. in include/linux/pid.h
Auf einem Kernel 2.6.39 Arm zu bauen, wenn current->pid
nicht funktioniert, dann es von getan werden kann:
pid_nr(get_task_pid(current, PIDTYPE_PID))
Die PIDTYPE_PID
kann durch PIDTYPE_PGID
oder PIDTYPE_SID
ersetzt werden. Die Header-Quelle ist bei include/linux/pid.h
, wie Yasushi darauf hinwies.
Welche der Ansätze funktioniert, hängt davon ab, welche Header-Dateien der Code verwendet.
was ist aktuell? Lesen erhält keinen aktuellen Wert als Argument ... ssize_t (* lesen) (struct file *, char __user *, size_t, loff_t *); – 0x90
@ 0x90 Es ist ein Makro. – cnicutar
http://kernelnewbies.org/FAQ/current, richtig? – 0x90