Como o modelo de E / S do 'cat' difere do de outros utilitários?

3

Da saída de stdbuf --help (GNU):

Usage: stdbuf OPTION... COMMAND
Run COMMAND, with modified buffering operations for its standard streams.
...

NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does
for example) then that will override corresponding changes by 'stdbuf'.
Also some filters (like 'dd' and 'cat' etc.) don't use streams for I/O,
and are thus unaffected by 'stdbuf' settings.

Estou confuso sobre qual é a definição precisa de "fluxos para E / S" neste contexto e como isso se aplica a cat em específico. Se ele não usa os fluxos de E / S padrão, o que ele usa? As páginas de manual pertinentes e a pesquisa na Web não forneceram mais detalhes.

    
por Sam 25.09.2018 / 17:00

2 respostas

4

O manual stdbuf é um pouco mais explícito :

command must start with the name of a program that

  1. uses the ISO C FILE streams for input/output (note the programs dd and cat don’t do that),
  2. does not adjust the buffering of its standard streams (note the program tee is not in this category).

Os fluxos ISO C FILE são fluxos como aqueles retornados por fopen , ao contrário de open . stdbuf funciona pré-carregando uma biblioteca libstdbuf que ajusta os fluxos FILE que a biblioteca C encapsula na entrada, saída e / ou erro padrão; os programas que não usam esses fluxos não são afetados. O GNU cat , por exemplo, usa o seu arquivo de entrada padrão descritor, ou um descritor de arquivo retornado por open .

    
por 25.09.2018 / 17:13
5

dd e cat usam as chamadas de sistema read(2) e write(2) diretamente, não as funções armazenadas em cache do C stdio ( fread(3) , fwrite(3) , printf(3) ), portanto, qualquer alteração no stdio não faz afetá-los.

stdbuf(1) funciona pré-carregando uma pequena biblioteca dinâmica (com LD_PRELOAD ou DYLD_INSERT_LIBRARIES no Mac) que substitui algumas funções do stdio para usar a estratégia de buffering desejada pelo usuário, não a usada por padrão pelo programa.

    
por 25.09.2018 / 17:16