0

私はc#とStandardoutputRedirectを使用してプロセスの出力を文字列で取得していますが、プロセスがまだ出力を待っているにもかかわらず、プログラムが出力を返さないことがあるという問題があります。出力がない場合は、プログラムを続行しますか??

これが私のコードです

Process tcpdump = new Process();
tcpdump.StartInfo.FileName= "/usr/sbin/tcpdump";
tcpdump.StartInfo.CreateNoWindow = true;
tcpdump.StartInfo.Arguments = " -i en1 -c 10 -nn tcp and src host " + ip + " and port " + ports[i];
tcpdump.StartInfo.UseShellExecute = false;
tcpdump.StartInfo.RedirectStandardOutput = true;
tcpdump.Start();
tcpdump.WaitForExit(3000);
string tcpdump_output = tcpdump.StandardOutput.ReadToEnd(); // at this part the programs waits for an output 
4

2 に答える 2

3

tcpdump.WaitForExit(3000);これは、プロセスをその時間だけ待機させる必要がありますが、先に進むためにプロセスを強制終了することもできます。

if (!tcpdump.WaitForExit(3000)) {
    tcpdump.Kill();
}

また、ドキュメントに従って、を呼び出す.StandardOutput.ReadToEnd() 前にを呼び出す必要WaitForExit()があります。そうしないと、デッドロックに入る可能性があります。したがって、コードを次のように更新してみてください。

string tcpdump_output = tcpdump.StandardOutput.ReadToEnd();
if (!tcpdump.WaitForExit(3000)) {
    tcpdump.Kill();
}
于 2012-08-27T10:02:39.060 に答える
0

それはあなたのために働きますか、あなたはチェックします

if (tcpdump.EndOfStream)
{
    // ...
}

最後まで読む前に?

于 2012-08-27T10:04:17.797 に答える