Pergunta

Tenho algumas perguntas básicas sobre os tubos que não tenho certeza.

a) Qual é o comportamento padrão se um processo escrevendo para um tubo for morto (ou seja, sigkill sigint) fechar o tubo? Ele lava o tubo? Ou o comportamento é indefinido?

b) Qual é o comportamento padrão se um processo retornar normalmente? É garantido lavar o tubo e fechar o tubo? (sem fazer isso explicitamente, é claro).

Gostaria que essas respostas fossem o mais geral possível, mas, na realidade, se depende inteiramente das especificações do sistema operacional, posso aceitar isso! No entanto, se houver um padrão POSIX ou um comportamento atual do Windows definido, ficaria muito grato por saber.

Obrigado.

Foi útil?

Solução

uma. Qual é o comportamento padrão se um processo escrevendo para um tubo for morto (ou seja, sigkill sigint) fechar o tubo? Ele lava o tubo? Ou o comportamento é indefinido?

Sigkill nunca permite nenhuma limpeza - o processo morre, morto. Com o SIGINT, depende se o processo lida com o sinal. Nesse caso, é provável que ele saia via saída (2), que libera alças de arquivo de E/S padrão. A questão é - o tubo estava conectado à saída padrão ou via Popen ()? Nesse caso, os dados tamperados pendentes poderia ser lavado; Caso contrário, não há dados em buffer, portanto a descarga é imaterial.

Se houver dados não lidos no tubo, esses dados permanecerão no tubo, prontos para o leitor coletar - assumindo que haja um leitor.

b. Qual é o comportamento padrão se um processo retornar normalmente? É garantido lavar o tubo e fechar o tubo? (sem fazer isso explicitamente, é claro).

Depende se o tubo foi conectado via E/S padrão ou não. Caso contrário, não há nada pendente. Nesse caso, sim, qualquer material nos buffers será lavado à medida que o fluxo de E/S padrão está fechado.


c. Obrigado pelas informações sobre sinais e dados não lidos, mas estou um pouco confuso sobre a conexão padrão de E/S. Depois que você mencionou o Popen (), procurei e a página do homem diz que seu valor de retorno idêntico a um fluxo de E/S e os fluxos são totalmente tamponados por padrão. Só não estou claro sobre a diferença entre os dois, nem entendo de onde vem a diferença.

O sistema básico exige a criação de tubos é pipe(2). Ele cria dois descritores de arquivos, um para a extremidade de leitura do tubo, um para a extremidade de gravação. Se você não fizer mais nada com eles, eles permanecerão como descritores de arquivos, com saída não sofrida (via write (2) e chamadas de sistema relacionadas). Se o processo terminar, não haverá buffer no aplicativo; o tubo está fechado.

Se você usar popen(3), então faz muito mais trabalho para você. Ainda invoca pipe(2) para criar os tubos, mas então faz um fork(2). A criança organiza a configuração correta dos tubos e inicia o processo filho. O pai também fecha a extremidade não utilizada do tubo e usa fdopen(3) Para criar um fluxo de arquivo de E/S padrão para o processo de chamada para usar.

Com o fluxo de arquivos, se houver dados no buffer de E/S, um fechamento ou equivalente garantirá que os dados pendentes sejam lavados e o descritor de arquivo esteja fechado.

Outras dicas

O comportamento normal é que todos os descritores de arquivo estão fechados quando um processo termina. Isso significa que um tubo, como qualquer outro descritor de arquivo aberto, está fechado normalmente.

Uma coisa interessante sobre os tubos: no Posix, se um processo gravar em um tubo que foi fechado, o escritor receberá um sinal, Sigpipe.


Editar:

Uma advertência: a diferença entre a terminação SIGX e uma terminação normal é que, como qualquer outra gravação de arquivo, você pode perder dados que foram bobes (através de uma gravação de arquivo) e ainda não gravados no descritor de arquivo.

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