¿Qué significa que cada proceso tiene un directorio actual?

10

Estoy leyendo "El entorno de programación de Unix", pero no entiendo el concepto actual del directorio de procesos.

Cada proceso tiene un directorio actual y se supone implícitamente que todos los nombres de archivo comienzan con el nombre de ese directorio, a menos que comiencen directamente con una barra inclinada.

¿Significa que cada proceso tiene un signo en qué directorio se creó? Por ejemplo, si /bin/sedse invocó el programa /home/rene, ¿el proceso que se creó al invocar sed tiene el directorio actual /home/rene?

Rene Ott
fuente

Respuestas:

13

Nivel conceptual

Cuando inicia un proceso desde su shell, el directorio de trabajo actual del proceso es el mismo que el directorio de trabajo actual de su shell. En el contexto del shell, el directorio de trabajo actual es la ubicación en la que se encuentra "actualmente".

El directorio de trabajo actual de cualquier proceso se utiliza para interpretar rutas relativas. Por ejemplo, si el directorio de trabajo actual de su concha era /home/reney que corrió ls ..desde el shell, directorio de trabajo actual del proceso, /home/renese usaría para resolver ..a /home.

Puede ver los directorios de trabajo actuales de todos los procesos que se ejecutan en su sistema lsof | grep '\scwd\s'(tenga en cuenta que probablemente necesitará ser root para ver los procesos de otros usuarios). Esto puede darle una idea de cómo se relacionan los directorios de trabajo actuales con el procesos que se ejecutan en su sistema.

Nivel de programa

El directorio de trabajo actual del shell es el directorio que ve y modifica con los shell incorporados pwdy cdrespectivamente. Estos comandos llaman a llamadas al sistema como getcwdy chdirque funcionan con el directorio de trabajo actual de su shell.

Utilizando bashcomo ejemplo, el cdincorporado finalmente ejecuta esta línea:

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

y el pwdincorporado finalmente ejecuta esta línea:

the_current_working_directory = getcwd (0, PATH_MAX);

El shell es solo un ejemplo conveniente del uso actual del directorio de trabajo; estas mismas llamadas al sistema también son utilizadas por otros programas. Un programa puede cambiar su directorio de trabajo actual /usry cualquier ruta relativa que use el programa comenzará desde el /usrdirectorio,

Nivel de grano

El kernel almacena el directorio de trabajo actual de un proceso. Linux lo almacena en el pwdmiembro de un fs_structapuntado por el fsmiembro de a task_struct. El pwdmiembro es una pathestructura, que apunta a información sobre el montaje ( vfsmount) y la ubicación del directorio en el sistema de archivos ( dentry). Cada proceso tiene un task_structasociado con él.

Los chdiry getcwdsistema de llamadas modificar y recuperar información en pwd.


fuente
Además, para el nivel del núcleo, es útil recordar que cuando se realiza una llamada al sistema, hay un puntero a la 'estructura de tareas' actual 'disponible, por lo que el código se ejecuta' en nombre del 'proceso actual. Se puede acceder a fs_struct a través del puntero a la tarea actual: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
Dmitrii S.
1

Cada proceso tiene un directorio de trabajo actual (CWD) al que está asignado cuando se inicia. Puede hacer lo siguiente para encontrar el directorio de trabajo para un proceso.

Ejecute ps aux para descubrir el PID de un proceso:

$ pgrep cupsd
24532

Para encontrar el directorio de trabajo actual de un PID: 24532

$ sudo pwdx 24532
24532: /

Entonces el proceso (PID: 24532) tiene un CWD de /.

Aquí hay otro ejemplo:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Esta vez el proceso del sueño (PID: 15988) tiene su conjunto CWD a mi directorio, /home/sam.

También puede ejecutar el 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

Aquí puede ver nuevamente el CWD para esos procesos, /y /home/sam.

Referencias

slm
fuente