Qu'est-ce que cela signifie que chaque processus a un répertoire actuel?

10

Je lis "The Unix Programming Environment", mais je ne comprends pas le concept répertoire courant de processus.

Chaque processus a un répertoire courant et tous les noms de fichiers sont supposés implicitement commencer par le nom de ce répertoire, à moins qu'ils ne commencent directement par une barre oblique.

Cela signifie-t-il que chaque processus a un signe dans quel répertoire il a été créé? Par exemple, si le programme a /bin/sedété appelé depuis /home/rene, alors le processus qui a été créé à partir de l'appel de sed a le répertoire courant /home/rene?

René Ott
la source

Réponses:

13

Niveau conceptuel

Lorsque vous démarrez un processus à partir de votre shell, le répertoire de travail actuel du processus est le même que le répertoire de travail actuel de votre shell. Dans le contexte du shell, le répertoire de travail actuel est l'emplacement où vous êtes actuellement "à".

Le répertoire de travail actuel de tout processus est utilisé pour interpréter les chemins relatifs. Par exemple, si le répertoire de travail était en cours de votre shell /home/reneet vous couru ls ..de la coquille, répertoire de travail courant du processus, /home/reneserait utilisé pour résoudre ..à /home.

Vous pouvez voir les répertoires de travail actuels de tous les processus en cours d'exécution sur votre système avec lsof | grep '\scwd\s'(notez que vous devrez probablement être root pour voir les processus des autres utilisateurs.) Cela peut vous donner une idée de la façon dont les répertoires de travail actuels sont liés à la processus en cours d'exécution sur votre système.

Niveau du programme

Le répertoire de travail actuel du shell est le répertoire que vous voyez et modifiez avec les commandes internes du shell pwdet cdrespectivement. Ces commandes appellent des appels système tels que getcwdet chdirqui fonctionnent avec le répertoire de travail actuel de votre shell.

En utilisant bashcomme exemple, le cdintégré exécute finalement cette ligne:

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

et le pwdintégré exécute finalement cette ligne:

the_current_working_directory = getcwd (0, PATH_MAX);

Le shell n'est qu'un exemple pratique de l'utilisation du répertoire de travail actuel; ces mêmes appels système sont également utilisés par d'autres programmes. Un programme peut changer son répertoire de travail actuel en /usret tous les chemins relatifs que le programme utilise commenceront à partir du /usrrépertoire,

Niveau noyau

Le répertoire de travail actuel d'un processus est stocké par le noyau. Linux le stocke dans le pwdmembre d'un fs_structpointé par le fsmembre d'un task_struct. Le pwdmembre est une pathstructure qui pointe vers des informations sur mount ( vfsmount) et l'emplacement du répertoire dans le système de fichiers ( dentry). Chaque processus a un task_structassocié.

Les appels système chdiret getcwdmodifient et récupèrent les informations dans pwd.


la source
De plus, pour le niveau du noyau, il est utile de se rappeler que lorsqu'un appel système est effectué, un pointeur vers la tâche_struct 'actuelle' est disponible - donc le code est exécuté 'au nom' du processus en cours. fs_struct est accessible via le pointeur sur le task_struct actuel: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
Dmitrii S.
1

Chaque processus a un répertoire de travail en cours (CWD) auquel il est affecté au démarrage. Vous pouvez effectuer les opérations suivantes pour trouver le répertoire de travail d'un processus.

Exécutez ps aux pour découvrir le PID d'un processus:

$ pgrep cupsd
24532

Pour trouver le répertoire de travail actuel d'un PID: 24532

$ sudo pwdx 24532
24532: /

Ainsi, le processus (PID: 24532) a un CWD de /.

Voici un autre exemple:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Cette fois , le processus de sommeil (PID: 15988) a son ensemble CWD à mon répertoire, /home/sam.

Vous pouvez également exécuter la ls -lcommande:

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

-ou-

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

Ici, vous pouvez à nouveau voir le CWD pour ces processus, /et /home/sam.

Références

slm
la source