entendendo “dpkg --status-fd n”

2

De man dpkg (1.16.16 (i386) em uma distribuição Linux baseada no Debian (7)):

--status-fd n
Send machine-readable package status and progress information to file descriptor n

Eu li isso como: " código legível por máquina avançada, tal como gerado com printf para um descritor de arquivo ". Eu (acho) saber os descritores de arquivo stdin (0), stdout (1) e stderr (2).

Tentando encontrar alguns exemplos que encontrei ao lado de nada além de relatórios de bugs, com descritores de arquivos parcialmente compostos por dois dígitos (possivelmente mais…). Isso ampliou meu conhecimento sobre os descritores de arquivos , o que levou a mais perguntas. Assim:

Pergunta : Como o dpkg option --status-fd é usado?

Um exemplo real e algumas notas sobre o que acontece me ajudariam muito a entender

    
por erch 01.05.2015 / 00:04

1 resposta

4

A opção --status-fd diz a dpkg para relatar o progresso de uma maneira que outros programas podem analisar, por exemplo, para apresentar relatórios de progresso para o usuário em uma GUI.

O argumento para --status-fd é um descritor de arquivo , ou seja, um número que designa um arquivo aberto. Simplificando as coisas um pouco:

  • Quando um processo abre um arquivo pela primeira vez, esse arquivo recebe o descritor número 0. Na próxima vez, o arquivo recebe o descritor número 1 e assim por diante. A chamada do sistema open retorna o descritor de arquivo.
  • Quando o processo deseja realizar uma operação no arquivo, como ler ou gravar a partir dele, ele designa o arquivo pelo seu descritor, por exemplo, read(0, addr, 10) significa “leia 10 bytes do descritor 0 e coloque-os no endereço de memória addr ”.
  • Cada processo tem seus próprios descritores de arquivo: o descritor de arquivo n no processo p não tem relação com o descritor de arquivo n no processo q .
  • Os processos herdam os descritores de arquivos de seus pais quando são criados.
  • Por convenção, os processos são executados com os descritores de arquivo 0, 1 e 2 já abertos. 0 deve ser usado para entrada, 1 para saída normal e 2 para mensagens de erro.

Redirection abre um arquivo em um descritor específico. Por exemplo, em um shell script ou na linha de comando, mycommand <somefile conecta o descritor de arquivo número 0 (entrada padrão) assim somefile (que é aberto para leitura) em vez do que era antes (o terminal, se o comando for executado em um terminal). Você pode preceder um número de descritor ao operador de redirecionamento: mycommand 3<somefile conecta o descritor de arquivo número 3 a somefile (a maioria dos comandos não faz nada com esse descritor de arquivo).

Quando o dpkg está instalando, atualizando ou removendo pacotes, ele executa vários outros comandos nos scripts de pré / pós instalação / remoção dos pacotes. Alguns desses comandos podem ler mensagens de entrada ou de exibição, portanto, o dpkg mantém os descritores padrão conectados ao que quer que eles estivessem conectados quando foi invocado.

Como os descritores de arquivo padrão já foram obtidos, dpkg permite que o chamador especifique um diferente para os relatórios de status. Você poderia colocar os relatórios de status em um arquivo, por exemplo:

dpkg --status-fd 3 -i somefile.deb 3>/tmp/dpkg.status

Em outro terminal, execute tail -n +1 -f /tmp/dpkg.status e observe as mensagens de status chegando.

Geralmente, o front-end que chama dpkg e deseja relatórios de status abre um canal (um canal de comunicação unidirecional ) antes de executar dpkg e passar o descritor de arquivo para gravar o final do pipe como o argumento de --status-fd . O front-end então lê a partir da extremidade de leitura do pipe e recebe mensagens de status à medida que são produzidas, sem arriscar que elas se misturem a qualquer outra coisa.

    
por 01.05.2015 / 00:22