PROBLEMA: Process.waitFor() entra um deadlock quando o processo pai não ler dados de processo filho

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 326709
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Process.waitFor() aparece ao inserir um deadlock quando o processo filho grava uma grande quantidade de dados para seu fluxo de saída e o processo pai nunca lê os dados.
Causa
O método Runtime.exec() cria um pipe para a saída padrão. Quando o processo filho grava uma grande quantidade de dados neste encanamento de modo que o buffer estiver cheio, ele bloqueia no pipe até que os dados no buffer pipe seja lida pelo processo pai. Se o processo pai nunca lê a saída padrão, Process.waitFor() não retornar.
Resolução
Para evitar o bloqueio, certifique-se que o processo pai sempre lê a saída padrão do processo filho.
Situação
Esse comportamento é por design.
Mais Informações
O programa de exemplo a seguir inicia um processo filho, WriteALot.exe e em seguida, aguarda que retornar. Observe que código tem sido adicionado ao ler a saída de WriteALot.exe poder Process.waitFor() não deadlock.
import java.io.*;public class Class1{	public static void main(String[] args)	{		String command = "WriteALot.exe";		try 		{			Process pr = Runtime.getRuntime().exec(command);			System.out.print("Waiting...");			new PrintStream(pr.getInputStream()).start();			pr.waitFor();			System.out.println("Done!");			int exitValue = pr.exitValue();			System.out.println("The exit value is " + exitValue);		} 		catch (Throwable t) 		{			System.out.println("Caught " + t);		}	}}class PrintStream extends Thread {	java.io.InputStream __is = null;	public PrintStream(java.io.InputStream is) 	{		__is = is;	} 	public void run() 	{		try 		{			while(this != null) 			{				int _ch = __is.read();				if(_ch != -1) 					System.out.print((char)_ch); 				else break;			}		} 		catch (Exception e) 		{			e.printStackTrace();		} 	}}				
o seguinte é o código para o aplicativo de console WriteALot, um Microsoft Visual C++ .NET:
//WriteALot.cpp#include "stdafx.h"#include "stdio.h"int _tmain(int argc, _TCHAR* argv[]){	for (int i=0; i<1000; i++)	{		printf("Writing %dth record\n", i);	}	return 0;}				
waitfor processo vjsharp jsharp j#

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 326709 - Última Revisão: 12/07/2015 11:59:17 - Revisão: 2.1

Microsoft Visual J# .NET 2003 Standard Edition

  • kbnosurvey kbarchive kbmt kbstreaming kbprb KB326709 KbMtpt
Comentários