Pergunta

Você pode usar o comando lsof para obter descritores de arquivos para todos os processos em execução, mas o que eu gostaria de fazer é fechar alguns desses descritores sem estar dentro desse processo. Isso pode ser feito no Windows, assim você pode facilmente desbloquear alguma aplicação.

Existe algum comando ou função para isso?

Foi útil?

Solução

Em Windows, você pode usar um programa para fazê-lo porque alguém escreveu um programa que insere um driver de dispositivo no kernel correndo para fazê-lo. Pela maneira que pode ser perigoso para fazer isso, porque depois de fechar um identificador que uma aplicação quebrado estava usando, o aplicativo não sabe que o cabo foi fechada, e quando o aplicativo é aberto algum outro objeto não relacionado que não sabe que o mesmo identificador pode agora se referem a algum outro objeto relacionado. Você realmente quer matar a aplicação partidos logo que possível.

No Linux certamente você pode usar o mesmo tipo de técnica. Escreva um programa que insere um módulo para o kernel em execução. Comunicar com o módulo e dizer-lhe que manipula para fechar. Será igualmente perigoso fazê-lo.

Outras dicas

Eu não sei por que você está tentando fazer isso, mas você deve ser capaz de anexar ao processo usando gdb e depois chamar close () na fd. Exemplo:

Em um shell: cat

Em outro shell:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Agora você dizer gdb para executar perto (0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

No primeiro shell eu recebo esta saída:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor

Eu não penso assim, mas lsof dá-lhe a PID do processo que abriu o arquivo, então o que você pode fazer é inteiramente matar o processo ou pelo menos enviar um sinal para deixá-lo sair.

duvido. descritores de arquivos são processo local, stdout é de 1 a todos os processos, mas eles ainda referência fluxos únicas claro.

Talvez mais detalhes seria útil, sobre o problema bloqueando você está tentando resolver.

Há muito menos necessidade de fazer isso no Unix que no Windows.

No Windows, a maioria dos programas tendem a "fechadura" (na verdade negar partilha) os arquivos que abrem, para que eles não podem ser lidos / escritos / excluído por outro programa.

No Unix, na maioria das vezes isso não acontece. bloqueio de arquivos em Unix é principalmente consultivo, e só irá bloquear outras tentativas de bloqueio, e não ler / escrever / operações de exclusão normais. Você pode até mesmo remover o diretório atual de um processo.

Sobre a única situação esta surge em uso normal em Unix é quando se tenta umount um sistema de arquivos (qualquer referência ao sistema de arquivos montado pode bloquear o umount).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top