Come posso ottenere il PID del processo utente che ha attivato la routine del modulo Kernel (vale a dire quale processo sta leggendo /dev/mydev
)?Acquisizione del pid del processo utente durante la scrittura di Kernel Module Linux
risposta
Quando la funzione di lettura è in esecuzione, lo fa nel contesto del processo che ha generato la chiamata di sistema. Pertanto, è possibile utilizzare current
, ad esempio current->pid
.
In questi giorni, abbiamo alcune funzioni di supporto definite in sched.h. Nel caso di pid, è possibile utilizzare:
pid = task_pid_nr(current);
per ottenere il pid dell'attività corrente.
questo è il commento preso da include/linux/sched.h
a partire dalla v3.8.
gli aiutanti per ottenere diversi PID del compito in quanto sono visti da vari namespace
- task_xid_nr(): id globale, vale a dire l'id visto dallo spazio dei nomi init;
- task_xid_vnr(): ID virtuale, ovvero l'ID visto dallo spazio dei nomi pid di corrente.
- task_xid_nr_ns(): id visto dall'ns specificato;
- set_task_vxid(): assegna un ID virtuale a un'attività;
vedi anche pid_nr() etc in include/linux/pid.h
su un kernel 2.6.39 braccio di compilazione, se current->pid
non funziona allora può essere fatto da:
pid_nr(get_task_pid(current, PIDTYPE_PID))
Il PIDTYPE_PID
può essere sostituito da PIDTYPE_PGID
o PIDTYPE_SID
. La fonte di intestazione è a include/linux/pid.h
come indicato da Yasushi.
Quale degli approcci funziona dipende da quali file di intestazione viene utilizzato il codice.
cos'è corrente? read non ottiene una corrente come argomento ... ssize_t (* read) (struct file *, char __user *, size_t, loff_t *); – 0x90
@ 0x90 È una macro. – cnicutar
http://kernelnewbies.org/FAQ/corrente, giusto? – 0x90