Lendo arquivo durante gravação no linux


9

Pelo que entendi, quando um arquivo está sendo gravado, o processo de gravação no arquivo obtém um bloqueio exclusivo. Portanto, outros processos não podem acessar este arquivo para leitura.

Com o conhecimento acima, não consigo entender como reproduzir um vídeo no media player, quando o navegador ainda está fazendo o download.


1
Especifique o motivo do voto negativo. Obrigado.
Sorter

2
Isso depende da plataforma; portanto, especifique o SO que você está perguntando. Eu sei que o Linux não fornece nenhum bloqueio implícito, mas o Windows pode ser diferente.
amon

Estou usando o Linux
Classificador

Respostas:


13

Sua compreensão está errada. Vários processos Linux podem gravar no mesmo arquivo de uma só vez (e o que acontece então pode ser não especificado, exceto quando os processos substituem diferentes segmentos desse arquivo). E algum outro processo Linux (por exemplo, seu navegador) pode ler um arquivo para o qual está gravado .

Você pode adotar uma convenção para evitar isso . Por exemplo, você pode usar o bloqueio de arquivo consultivo (adotando a convenção de que todo programa relevante deve fazer isso), por exemplo, com flock (2) , lockf (3) , etc. convenções) para acessar (ou mesmo gravar) esse arquivo. Você pode usar máquinas de permissão (por exemplo, dedicando um usuário do sistema ao seu programa setuid ).

Veja também as respostas this & that no StackOverflow (alguns deles mencionaram os mecanismos específicos do Linux de bloqueio obrigatório obsoleto ). Leia sobre as propriedades do ACID , considere usar algum banco de dados ( sqlite , PostGreSQL , MongoDB , etc ...) ou algum arquivo indexado ( gdbm ).

Não conheço o Windows, mas ouvi o boato de que ele não permite acesso simultâneo ou grava no mesmo arquivo.


4

Os arquivos geralmente não estão bloqueados - bloqueio de arquivo unix . Também é bastante comum ter vários leitores de arquivo, mas apenas um escritor. Os problemas ocorrem apenas quando você tem vários gravadores.

Além disso, a maioria dos formatos de arquivo de vídeos (e especialmente na Web) é adaptável, o que significa que você não precisa ter o vídeo inteiro para reproduzi-lo.


Podem ocorrer problemas se você contar com o conteúdo de um arquivo para não mudar entre as leituras, por exemplo, ao tentar evitar carregar arquivos grandes na memória.
yyny

2

Os sistemas operacionais Unix não usam bloqueio obrigatório (o Gnu / Linux é um Unix, outros exemplos são UNIX, BSD, Mac OSX). Bloqueio como evitado sempre que possível.

Alguns outros sistemas operacionais usam o bloqueio obrigatório o tempo todo (principalmente o sistema operacional Windows da Microsoft). Isso impedirá a reprodução até o download completo, além de renomear um arquivo ou diretório que está aberto (em que um aplicativo está). Mas no Unix está tudo bem. Se um aplicativo precisar ser bloqueado, ele poderá ser usado. Mas não normalmente.


Você pode optar por não bloquear arquivos no Windows também. Eu toco vídeos baixados pela metade o tempo todo. O bloqueio é necessário apenas para executáveis ​​carregados.
CodesInChaos

@CodesInChaos É verdade, mas a maioria dos aplicativos é bloqueada, você sabe se pode entrar em um diretório sem bloquear? Também estou pensando: como os executáveis ​​no Linux funcionam sem o bloqueio (ambos os sistemas usam carregamento bem no tempo, para que os bits possam ser carregados muito tempo após o início do programa), ou pode usar seus super poderes de vaca.
Ctrl-alt-delor

1
Eu acho que a grande diferença entre Linux e Windows é que o Linux trata o arquivo como separado de sua entrada no sistema de arquivos. Assim, você pode desvincular um nome de arquivo enquanto está aberto. O Windows, por outro lado, atrasa a exclusão até que ela seja fechada. O Linux permite a modificação da execução de arquivos executáveis? Ou apenas permite a exclusão + recreação com conteúdo diferente?
CodesInChaos

@CodesInChaos Ambos, eu acho, eu queria saber o que aconteceria se você o modificasse, não exclua + crie. Meu palpite é que, quando um aplicativo é carregado, o sistema operacional abre o arquivo no modo COW (Copy On Write), se e somente se algum processo alterar o conteúdo, o sistema operacional fará uma cópia (dos blocos modificados). Uma cópia está vinculada ao (s) processo (s), a outra ao arquivo. Quando todos os processos que usam o original são fechados, a cópia original é excluída (como nenhuma entrada do sistema de arquivos). Isso é apenas um palpite, com base no que sei que o sistema operacional pode fazer.
CTRL-ALT-DELOR
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.