Cosa significa che ogni processo ha una directory corrente?


10

Sto leggendo "L'ambiente di programmazione Unix", ma non capisco il concetto dell'attuale directory del processo.

Ogni processo ha una directory corrente e si presume implicitamente che tutti i nomi dei file inizino con il nome di quella directory, a meno che non inizino direttamente con una barra.

Significa che ogni processo ha un segno in quale directory è stato creato? Ad esempio, se il programma è /bin/sedstato invocato /home/rene, allora il processo creato dall'invocazione di sed ha la directory corrente /home/rene?

Risposte:


13

Livello concettuale

Quando si avvia un processo dalla shell, la directory di lavoro corrente del processo è la stessa della directory di lavoro corrente della shell. Nel contesto della shell, la directory di lavoro corrente è la posizione in cui ci si trova attualmente "."

La directory di lavoro corrente di qualsiasi processo viene utilizzata per interpretare i percorsi relativi. Ad esempio, se la directory di lavoro corrente della shell era /home/reneed è stato eseguito ls ..dalla shell, directory di lavoro corrente del processo, /home/rene, sarebbero stati utilizzati per risolvere ..a /home.

Puoi vedere le directory di lavoro correnti di tutti i processi in esecuzione sul tuo sistema lsof | grep '\scwd\s'(tieni presente che probabilmente dovrai essere root per vedere i processi di altri utenti.) Questo può darti un'idea di come le attuali directory di lavoro si collegano al processi in esecuzione sul tuo sistema.

Livello del programma

L'attuale directory di lavoro della shell è la directory che vedi e modifichi con gli shell incorporati pwde cdrispettivamente. Questi comandi chiamano chiamate di sistema come getcwde chdirche funzionano con l'attuale directory di lavoro della shell.

Usando bashcome esempio, il cdbuilt-in alla fine esegue questa riga:

if (chdir (nolinks ? newdir : tdir) == 0)

e il pwdbuilt-in alla fine esegue questa linea:

the_current_working_directory = getcwd (0, PATH_MAX);

La shell è solo un comodo esempio dell'uso della directory di lavoro corrente; queste stesse chiamate di sistema vengono utilizzate anche da altri programmi. Un programma può cambiare la sua directory di lavoro corrente in /usre tutti i percorsi relativi che il programma utilizza inizieranno dalla /usrdirectory,

Livello del kernel

L'attuale directory di lavoro di un processo è memorizzata dal kernel. Linux lo memorizza nel pwdmembro di un fs_structpuntato dal fsmembro di un task_struct. Il pwdmembro è uno pathstruct, che punta a informazioni sul mount ( vfsmount) e sulla posizione della directory nel filesystem ( dentry). Ogni processo ha un task_structassociato con esso.

Le chiamate chdire di getcwdsistema modificano e recuperano le informazioni in pwd.


Inoltre, per il livello del kernel è utile ricordare che quando viene effettuata una chiamata di sistema, è disponibile un puntatore al task_struct "corrente", quindi il codice viene eseguito "per conto del" processo corrente. È possibile accedere a fs_struct tramite il puntatore all'attuale task_struct: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
Dmitrii S.

1

Ogni processo ha una directory di lavoro corrente (CWD) a cui è assegnato all'avvio. È possibile effettuare le seguenti operazioni per scoprire la directory di lavoro per un processo.

Esegui ps aux per scoprire il PID di un processo:

$ pgrep cupsd
24532

Per scoprire l'attuale directory di lavoro di un PID: 24532

$ sudo pwdx 24532
24532: /

Quindi il processo (PID: 24532) ha un CWD di /.

Ecco un altro esempio:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Questa volta il processo di sonno (PID: 15988) ha il CWD insieme alla mia home directory, /home/sam.

Puoi anche eseguire il ls -lcomando:

$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /

-o-

$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam

Qui puoi vedere di nuovo il CWD per quei processi /e /home/sam.

Riferimenti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.