Estou lendo "The Unix Programming Environment", mas não compreendo o conceitodiretório atualde processo.
Cada processo tem umdiretório atual, e todos os nomes de arquivos são implicitamente assumidos como começando com o nome desse diretório, a menos que comecem diretamente com uma barra.
Isso significa que todo processo tem um sinal em qual diretório foi criado? Por exemplo, se o programa /bin/sed
foi invocado de /home/rene
, então o processo que foi criado a partir da invocação de sed possui o diretório atual /home/rene
?
Responder1
Nível conceitual
Quando você inicia um processo a partir do seu shell, o diretório de trabalho atual do processo é igual ao diretório de trabalho atual do seu shell. No contexto do shell, o diretório de trabalho atual é o local em que você está “no momento”.
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 fosse /home/rene
e você executasse ls ..
a partir do shell, o diretório de trabalho atual do processo, /home/rene
, seria usado para ..
resolver /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 ideia 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 recursos internos do shell pwd
e cd
respectivamente. Esses comandos chamam chamadas de sistema como getcwd
e chdir
que funcionam com o diretório de trabalho atual do seu shell.
Usando bash
como exemplo, o cd
built-in eventualmente executa esta linha:
if (chdir (nolinks ? newdir : tdir) == 0)
e o pwd
built-in 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 /usr
e quaisquer caminhos relativos que o programa usar começarão a partir do /usr
diretório,
Nível do kernel
O diretório de trabalho atual de um processo é armazenado pelo kernel. O Linux o armazena no pwd
membro fs_struct
a apontado pelo fs
membro de a task_struct
. O pwd
membro é uma path
estrutura, que aponta para informações sobre a montagem ( vfsmount
) e a localização do diretório no sistema de arquivos ( dentry
). Cada processo tem um task_struct
associado.
As chamadas de sistema chdir
e getcwd
modificam e recuperam informações em arquivos pwd
.
Responder2
Cada processo possui um diretório de trabalho atual (CWD) ao qual é atribuído quando é inicializado. 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 para meu diretório inicial, /home/sam
.
Você também pode executar o ls -l
comando:
$ 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 desses processos /
e /home/sam
.