O que significa que cada processo tem um diretório atual?


10

Estou lendo "O ambiente de programação Unix", mas não entendo o conceito de diretório atual do processo.

Cada processo tem um diretório atual e todos os nomes de arquivos são assumidos implicitamente para iniciar com o nome desse diretório, a menos que eles iniciem diretamente com uma barra.

Isso significa que todo processo tem um sinal em qual diretório foi criado? Por exemplo, se o programa /bin/sedfoi chamado /home/rene, o processo criado a partir da chamada sed possui o diretório atual /home/rene?

Respostas:


13

Nível conceitual

Quando você inicia um processo a partir do seu shell, o diretório de trabalho atual do processo é o mesmo que o diretório de trabalho atual do seu shell. No contexto do shell, o diretório de trabalho atual é o local em que você está "atualmente".

O diretório de trabalho atual de qualquer processo é usado para interpretar caminhos relativos. Por exemplo, se o diretório de trabalho atual do seu shell foi /home/renee você correu ls ..a partir da casca, diretório de trabalho atual do processo, /home/rene, seria usado para resolver ..a /home.

Você pode ver os diretórios de trabalho atuais de todos os processos em execução no seu sistema lsof | grep '\scwd\s'(observe que você provavelmente precisará ser root para ver os processos de outros usuários.) Isso pode lhe dar uma idéia de como os diretórios de trabalho atuais se relacionam com o processos em execução no seu sistema.

Nível do programa

O diretório de trabalho atual do shell é o diretório que você vê e modifica com os built-ins do shell pwde, cdrespectivamente. Esses comandos chamam chamadas do sistema como getcwde chdirque funcionam com o diretório de trabalho atual do seu shell.

Usando bashcomo exemplo, o cdinterno eventualmente executa esta linha:

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

e o pwdinterno eventualmente executa esta linha:

the_current_working_directory = getcwd (0, PATH_MAX);

O shell é apenas um exemplo conveniente do uso do diretório de trabalho atual; essas mesmas chamadas de sistema também são usadas por outros programas. Um programa pode alterar seu diretório de trabalho atual para /usre todos os caminhos relativos que o programa usa serão iniciados no /usrdiretório,

Nível do Kernel

O diretório de trabalho atual de um processo é armazenado pelo kernel. O Linux o armazena no pwdmembro de um fs_structapontado pelo fsmembro de um task_struct. O pwdmembro é uma pathestrutura, que aponta para informações sobre o mount ( vfsmount) e a localização do diretório no sistema de arquivos ( dentry). Cada processo tem um task_structassociado a ele.

As chamadas chdire do getcwdsistema modificam e recuperam informações em pwd.


Além disso, para o nível do kernel, é útil lembrar que, quando uma chamada do sistema é feita, há um ponteiro para a tarefa 'atual' disponível - para que o código seja executado 'em nome do' processo atual. O fs_struct pode ser acessado através do ponteiro para o task_struct atual: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
Dmitrii S.

1

Todo processo possui um diretório de trabalho atual (CWD) ao qual é atribuído quando é iniciado. Você pode fazer o seguinte para descobrir o diretório de trabalho de um processo.

Execute ps aux para descobrir o PID de um processo:

$ pgrep cupsd
24532

Para descobrir o diretório de trabalho atual de um PID: 24532

$ sudo pwdx 24532
24532: /

Portanto, o processo (PID: 24532) tem um CWD de /.

Aqui está outro exemplo:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Desta vez, o processo de suspensão (PID: 15988) tem seu CWD definido no meu diretório pessoal /home/sam,.

Você também pode executar o ls -lcomando:

$ 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

Aqui você pode ver novamente o CWD para esses processos /e /home/sam.

Referências

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.