C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: Processの標準出力をリアルタイム取得


(過去ログ 37 を表示中)

[トピック内 38 記事 (1 - 20 表示)]  << 0 | 1 >>

■19072 / inTopicNo.1)  Processの標準出力をリアルタイム取得
  
□投稿者/ 鶏唐揚 (137回)-(2008/05/20(Tue) 09:59:01)

分類:[VB.NET/VB2005] 

[OS]WinXP
[VB]2003/2005

お世話になっております。
今回は表題の通り、ProcessのStandardOutputを逐次読み取りたいというものです

わかりやすいとこで言うとPINGコマンド等、処理の間にもプロンプトに
順次表示されるものを、呼び出し元で奪ってしまおうと思ったのですが
当初書いた以下のコードでは当然ながら最終的な出力結果がまとめて返ってきます

Dim proc As Process

proc = New Process

With proc.StartInfo
    .FileName = "PING"
    .Argument = "xxx.xxx.xx.xx"     'IPは伏せます
    .RedirectStandardOutput = True
    .WindowStyle = ProcessWindowStyle.Hidden
    .CreateNoWindow = True
    .UseShellExecute = False
End With

proc.Start()
Debug.WriteLine(proc.StandardOutput.ReadToEnd())
proc.WaitForExit(10000)

proc.Close()
proc.Dispose()
proc = Nothing


タイマーでReadToEndとも考えたのですが良く考えればStartで固まるので
意味ありませんでした。
マルチスレッド使わずに標準出力のリアルタイム取得を実現できる方法があれば
ご教示願いたいと思います(マルチスレッド使って実現できるかどうかも未確認ですが)

引用返信 編集キー/
■19073 / inTopicNo.2)  Re[1]: Processの標準出力をリアルタイム取得
□投稿者/ れい (553回)-(2008/05/20(Tue) 10:11:29)
No19072 (鶏唐揚 さん) に返信
> タイマーでReadToEndとも考えたのですが良く考えればStartで固まるので
> 意味ありませんでした。
> マルチスレッド使わずに標準出力のリアルタイム取得を実現できる方法があれば
> ご教示願いたいと思います(マルチスレッド使って実現できるかどうかも未確認ですが)

?
普通に非同期よみこみなり
長さを指定して読み込んだりすればいいだけではないでしょうか?

Startで固まる、というのも理解不可能です。
少し時間はかかりますが、すぐに戻ってくるような。

何か違うことをいってるのでしょうか?
引用返信 編集キー/
■19076 / inTopicNo.3)  Re[1]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (424回)-(2008/05/20(Tue) 10:29:03)
No19072 (鶏唐揚 さん) に返信

マルチスレッドでなく、という要件を満たすかどうかわかりませんが
(非同期読み取りは内部的にマルチスレッドなので)、こんなコードでできました。
構文的には C# 3.0、フレームワーク的にも .NET Framework 2.0 のを使っちゃってますけど。

using (Process p = new Process())
{
    p.StartInfo.FileName = "ping.exe";
    p.StartInfo.Arguments = "127.0.0.1";
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = false;
    p.OutputDataReceived += (sender, e) =>
    {
        if( ! string.IsNullOrEmpty(e.Data) )
        {
            Console.WriteLine(e.Data);
        }
    };

    p.Start();
    p.BeginOutputReadLine();
    p.WaitForExit();
}

Console.WriteLine();
Console.WriteLine("Complete");

が、DataReceivedEventArgs.Data には時折空文字列が来るようで、
string.IsNullOrEmpty を外すと、数行の空行が出てしまいますが、
排除すると、コマンドプロンプトから叩いた時の出るべき空行も排除してしまうので、
そのままの出力を再現することはできませんでした。

他にも方法はあるかと思います。

引用返信 編集キー/
■19077 / inTopicNo.4)  Re[2]: Processの標準出力をリアルタイム取得
□投稿者/ 鶏唐揚 (138回)-(2008/05/20(Tue) 10:30:56)
No19073 (れい さん) に返信
> ?
> 普通に非同期よみこみなり
> 長さを指定して読み込んだりすればいいだけではないでしょうか?
>
> Startで固まる、というのも理解不可能です。
> 少し時間はかかりますが、すぐに戻ってくるような。
>
> 何か違うことをいってるのでしょうか?
違うことを言ってるのかどうか判断しかねますが、
もう少し具体的に書いてみます。

Startで固まるというのは、PINGコマンドが完了するまでメインスレッドが待機して
しまうということです。WaitForExitを外しても同様でした。

コマンドプロンプトで単純に
PING xxx.xxx.xx.xx
と打つと、(PINGが通る場合は)通常は約1秒ごとにReply from...と
4回表示されると思いますが、これをそのままのタイミングで
標準出力を奪って表示したいということです。

引用返信 編集キー/
■19078 / inTopicNo.5)  Re[2]: Processの標準出力をリアルタイム取得
□投稿者/ れい (554回)-(2008/05/20(Tue) 10:32:26)
2008/05/20(Tue) 10:36:01 編集(投稿者)
No19076 (シャノン さん) に返信
> (非同期読み取りは内部的にマルチスレッドなので)、こんなコードでできました。

どこまで考えるかによりますが、
ユーザーモードの範囲内なら非同期読み取りはマルチスレッドでないものもありますよ。
特にストリームは。

> 他にも方法はあるかと思います。

じゃあWindows.Formsで。
ただ、鶏唐揚さんが何をしたいのかいまいちよくわからないのですよね。
こんな簡単なのでいいのかしら?


    Dim proc As Process
    Dim ar As IAsyncResult
    Dim dlg As ReadLine
    Delegate Function ReadLine() As String

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If proc IsNot Nothing Then Exit Sub
        proc = New Process

        With proc.StartInfo
            .FileName = "PING"
            .Arguments = "192.168.68.1" '私のプライベートアドレスはこれ。
            .RedirectStandardOutput = True
            .WindowStyle = ProcessWindowStyle.Hidden
            .CreateNoWindow = True
            .UseShellExecute = False
        End With

        proc.Start()
        dlg = New ReadLine(AddressOf proc.StandardOutput.ReadLine)
        ar = dlg.BeginInvoke(Nothing, Nothing)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If ar.IsCompleted Then
            Dim str As String
            str = dlg.EndInvoke(ar)
            If str Is Nothing Then
                Timer1.Stop()
                proc = Nothing
            Else
                Me.TextBox1.Text &= str & ControlChars.NewLine
                ar = dlg.BeginInvoke(Nothing, Nothing)
            End If
        End If
    End Sub

追記。

> Startで固まるというのは、PINGコマンドが完了するまでメインスレッドが待機して
> しまうということです。WaitForExitを外しても同様でした。

StartではなくReadToEndで固まってるのではないですか?

> コマンドプロンプトで単純に
> PING xxx.xxx.xx.xx
> と打つと、(PINGが通る場合は)通常は約1秒ごとにReply from...と
> 4回表示されると思いますが、これをそのままのタイミングで
> 標準出力を奪って表示したいということです。

とすると、ストリームの扱いに慣れていないのでしょう。
No18620 の投稿とかにちょっと書いたので参考に。

引用返信 編集キー/
■19080 / inTopicNo.6)  Re[2]: Processの標準出力をリアルタイム取得
□投稿者/ 鶏唐揚 (139回)-(2008/05/20(Tue) 10:35:07)
2008/05/20(Tue) 10:37:40 編集(投稿者)

No19076 (シャノン さん) に返信
> マルチスレッドでなく、という要件を満たすかどうかわかりませんが
自分でマルチスレッド作って自分で制御して…というのをやりたくないというだけなので
内部的にマルチスレッドになってるだけというのなら大丈夫です

> (非同期読み取りは内部的にマルチスレッドなので)、こんなコードでできました。
> 構文的には C# 3.0、フレームワーク的にも .NET Framework 2.0 のを使っちゃってますけど。
>略
> が、DataReceivedEventArgs.Data には時折空文字列が来るようで、
> string.IsNullOrEmpty を外すと、数行の空行が出てしまいますが、
> 排除すると、コマンドプロンプトから叩いた時の出るべき空行も排除してしまうので、
> そのままの出力を再現することはできませんでした。
>
> 他にも方法はあるかと思います。
ありがとうございます。上記コードを解析してVBにしてみます。
空白行の問題はその後に考えてみます
引用返信 編集キー/
■19081 / inTopicNo.7)  Re[2]: Processの標準出力をリアルタイム取得
□投稿者/ ネタ好き (298回)-(2008/05/20(Tue) 10:35:40)
マルチスレッドで、共有する標準入力(コンソール)に出力される結果を、
違う処理結果を混ぜないで得る方法ですよね?
仮にそうだとして話を進めます。
標準入力をコンソールに絞って言うと、マルチスレッドで結果を受け取り、
受け取った直後にConsole.Clearで処理結果で埋まったコンソールを消してしまえばいいと思います。
勿論、同期がらみのややこしい事は覚悟せねばなりませんが、
こうする事により結果を混ぜないで出力結果を得られます。
忙しいので検証しておりませんが是非お試しください。
引用返信 編集キー/
■19083 / inTopicNo.8)  Re[3]: Processの標準出力をリアルタイム取得
□投稿者/ 鶏唐揚 (140回)-(2008/05/20(Tue) 10:49:55)
>ただ、鶏唐揚さんが何をしたいのかいまいちよくわからないのですよね
説明下手ですみません^^;

んーーと…LameっていうMP3エンコーダは、プロンプトに進捗が表示されますよね。
ProcessでLameを蹴って、その進捗表示をVB側で受け取ってリアルタイムで
表示させておきたいなーというようなものです。
が、私の方法ではStart(と当初はそう思っていたが実際はれいさんのご指摘どおりReadToEndでした)で
待機してしまうため、どうすればええんかいなというわけです。

非同期ができるということを知らなかったためちぐはぐな質問になってたようです。

>とすると、ストリームの扱いに慣れていないのでしょう
おっしゃるとおりです。正直ストリームというものに触ったのは.NETからなので
ファイル入出力くらいにしか使ったことがありません…

れいさんのコードも参考にさせていただきます

Toネタ好きさん
>マルチスレッドで、共有する標準入力(コンソール)に出力される結果を、
>違う処理結果を混ぜないで得る方法ですよね?
VB側はマルチスレッドしてないです。ProcessでPINGなりLameなりの
コンソールアプリをキックし、その標準出力を出力された端から奪って表示したいけど
今の方法じゃキック対象が終了してからそれまでの出力がまとめて返ってくるので困っていた
ということです。言葉足らずで申し訳ございませんorz
引用返信 編集キー/
■19085 / inTopicNo.9)  Re[3]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (426回)-(2008/05/20(Tue) 10:53:22)
No19078 (れい さん) に返信

> ■No19076 (シャノン さん) に返信
>>(非同期読み取りは内部的にマルチスレッドなので)、こんなコードでできました。
>
> どこまで考えるかによりますが、
> ユーザーモードの範囲内なら非同期読み取りはマルチスレッドでないものもありますよ。
> 特にストリームは。

んー。
そう来るのは予想できていましたが、厳密に突き詰めても得るものはないですし。
「マルチスレッドかもしれないので」くらいにしておいてください。

>>他にも方法はあるかと思います。
>
> じゃあWindows.Formsで。

「コンソールプロセスが終了するまで待機」というのをしなくていいのが楽ですね。
個人的には、そこをどうするかが課題のひとつだと思っていますが。
引用返信 編集キー/
■19086 / inTopicNo.10)  Re[1]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (427回)-(2008/05/20(Tue) 10:55:26)
No19072 (鶏唐揚 さん) に返信

.NET Framework 1.1 でもできる範囲のコードで。

class AsyncArgument
{
    public Process process;
    public Stream stream;
    public byte[] buffer;
}

private static void Ping2()
{
    using (Process p = new Process())
    {
        p.StartInfo.FileName = "ping.exe";
        p.StartInfo.Arguments = "127.0.0.1";
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.UseShellExecute = false;

        p.Start();

        byte[] outputBuffer = new byte[1024];
        AsyncArgument aa = new AsyncArgument();
        aa.process = p;
        aa.stream = p.StandardOutput.BaseStream;
        aa.buffer = outputBuffer;

        aa.stream.BeginRead(outputBuffer, 0, 1024, StandardOutputCallback, aa);
        p.WaitForExit();
    }

    Console.WriteLine();
    Console.WriteLine("Complete");
}

static void StandardOutputCallback(IAsyncResult result)
{
    AsyncArgument aa = result.AsyncState as AsyncArgument;
    int count = aa.stream.EndRead(result);

    string output = Console.OutputEncoding.GetString(aa.buffer, 0, count);
    if (!string.IsNullOrEmpty(output))
    {
        Console.WriteLine(output);
    }

    if (!aa.process.HasExited)
    {
        aa.stream.BeginRead(aa.buffer, 0, 1024, StandardOutputCallback, aa);
    }
}

しかし出力は細切れになってしまう。

引用返信 編集キー/
■19087 / inTopicNo.11)  Re[2]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (429回)-(2008/05/20(Tue) 11:02:45)
No19086 (シャノン さん) に返信
> ■No19072 (鶏唐揚 さん) に返信
>
> .NET Framework 1.1 でもできる範囲のコードで。
> しかし出力は細切れになってしまう。

> string output = Console.OutputEncoding.GetString(aa.buffer, 0, count);
> if (!string.IsNullOrEmpty(output))
> {
> Console.WriteLine(output);
> }

ここを Console.Write にしたらうまくいったよー!
引用返信 編集キー/
■19088 / inTopicNo.12)  Re[3]: Processの標準出力をリアルタイム取得
□投稿者/ 鶏唐揚 (141回)-(2008/05/20(Tue) 11:06:38)
No19087 (シャノン さん) に返信
> ■No19086 (シャノン さん) に返信
>>■No19072 (鶏唐揚 さん) に返信
>>
>>.NET Framework 1.1 でもできる範囲のコードで。
>>しかし出力は細切れになってしまう。
>
>> string output = Console.OutputEncoding.GetString(aa.buffer, 0, count);
>> if (!string.IsNullOrEmpty(output))
>> {
>> Console.WriteLine(output);
>> }
>
> ここを Console.Write にしたらうまくいったよー!
1KBごとに取得・表示を行っているので改行いれたら細切れになってたということですか

#現在上記3手法のコードを解析中…
引用返信 編集キー/
■19090 / inTopicNo.13)  Re[2]: Processの標準出力をリアルタイム取得
□投稿者/ れい (555回)-(2008/05/20(Tue) 11:11:23)
2008/05/20(Tue) 11:22:56 編集(投稿者)
2008/05/20(Tue) 11:13:27 編集(投稿者)

No19086 (シャノン さん) に返信
> ■No19072 (鶏唐揚 さん) に返信
>
> .NET Framework 1.1 でもできる範囲のコードで。

いやそのコードはマルチスレッドですから:D

> しかし出力は細切れになってしまう。

素直にStreamReaderとWaitHandle使いましょうよ


まぁこの辺はいくらでも何とでもなりますよ>鶏唐揚さん
シャノンさんの最初のコードのように、Processに内蔵のイベントつかってもいいですし、
StreamReaderを非同期でよんでもいいですし、
Streamを非同期で読んでもいいですし、
部分的にマルチスレッドにしてもいいですし。
自分の実装に合ったものを選べばよいでしょう。

追記。

> 1KBごとに取得・表示を行っているので改行いれたら細切れになってたということですか

違います。
Readはいくつ読むのか不定というだけです。

さらに追記。

シャノン産のコード。

string output = Console.OutputEncoding.GetString(aa.buffer, 0, count);

ここはダメですねぇ。
GetDecoderしてDecoder取っておかないと、文字が化けちゃいます。
引用返信 編集キー/
■19092 / inTopicNo.14)  Re[4]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (430回)-(2008/05/20(Tue) 11:29:08)
No19088 (鶏唐揚 さん) に返信
> 1KBごとに取得・表示を行っているので改行いれたら細切れになってたということですか

いや、バッファサイズをどうやっても WriteLine を使うと細切れになるんだけどね。
俺の2つ目の方法では、ちゃんと改行コードもバッファに取得できるんです。
だから自分で改行コードを付加する WriteLine を使う必要は無い。Write で改行コードごと書き出せばちゃんと改行してくれる。

俺の1つ目の方法では、e.Data に改行コードが入ってこないんですよ。
だから Console.Write にするとすべてのデータが一行になってしまう。
そこで WriteLine を使っていたわけ。
引用返信 編集キー/
■19095 / inTopicNo.15)  Re[3]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (431回)-(2008/05/20(Tue) 11:35:57)
No19090 (れい さん) に返信
>>.NET Framework 1.1 でもできる範囲のコードで。
> 
> いやそのコードはマルチスレッドですから:D

new Thread() してなければ OK だっ!

>>しかし出力は細切れになってしまう。
> 
> 素直にStreamReaderとWaitHandle使いましょうよ

それでもいいのか。
StreamReader を使うというのは良くわからんが。

というわけで第三弾。

using (Process p = new Process())
{
    p.StartInfo.FileName = "ping.exe";
    p.StartInfo.Arguments = "127.0.0.1";
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = false;

    p.Start();

    while (! p.HasExited)
    {
        byte[] outputBuffer = new byte[1024];

        IAsyncResult result = p.StandardOutput.BaseStream.BeginRead(outputBuffer, 0, outputBuffer.Length, null, null);
        result.AsyncWaitHandle.WaitOne();
        int count = p.StandardOutput.BaseStream.EndRead(result);

        string output = p.StandardOutput.CurrentEncoding.GetString(outputBuffer, 0, count);
        Console.Write(output);
    }
}

Console.WriteLine();
Console.WriteLine("Complete");

> string output = Console.OutputEncoding.GetString(aa.buffer, 0, count);
> 
> ここはダメですねぇ。
> GetDecoderしてDecoder取っておかないと、文字が化けちゃいます。

え、そうなの?

引用返信 編集キー/
■19096 / inTopicNo.16)  Re[2]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (432回)-(2008/05/20(Tue) 11:40:56)
No19076 (シャノン さん) に返信
> が、DataReceivedEventArgs.Data には時折空文字列が来るようで、
> string.IsNullOrEmpty を外すと、数行の空行が出てしまいますが、
> 排除すると、コマンドプロンプトから叩いた時の出るべき空行も排除してしまうので、
> そのままの出力を再現することはできませんでした。

これバグくさいなー。
Framework のソースを追ってみたけど、BeginOutputReadLine の内部では、やっぱり StandardOutput.BaseStream.BeginRead を使って出力を読み取っている。
それを文字列に整形する際に、バッファの中から \r と \n を探して、そこまでを1行として返すような処理をしている(AsyncStreamReader.GetLinesFromStringBuilder)。
が、ステップ実行してみると、改行文字が \r\r\n と続く場合があり、このときは空行が2行連続してしまう。
C でコンソールアプリを組んだとき、改行文字に \n ではなく \r\n を使ったプログラムを、コマンドプロンプトからテキストファイルにリダイレクトするとこういう現象が起こる。
リダイレクトする際に \n を \r\n に置き換えて出力してくれるらしい。
引用返信 編集キー/
■19103 / inTopicNo.17)  Re[3]: Processの標準出力をリアルタイム取得
□投稿者/ れい (557回)-(2008/05/20(Tue) 12:05:17)
No19096 (シャノン さん) に返信
> これバグくさいなー。

pingの、ですね。

No19095 (シャノン さん) に返信
>>string output = Console.OutputEncoding.GetString(aa.buffer, 0, count);
>>
>>ここはダメですねぇ。
>>GetDecoderしてDecoder取っておかないと、文字が化けちゃいます。
>
> え、そうなの?

OutputEncodingがUTF-16なときに
3バイトの読み込みで返ってきたりしたら切れちゃいますよ。
必ず偶数まで読む、なんて保証はないですから。

> それでもいいのか。
> StreamReader を使うというのは良くわからんが。

StreamReaderに折角「改行まで読む」というメソッドがあるのに使わないのはもったいないというだけです。

引用返信 編集キー/
■19106 / inTopicNo.18)  Re[4]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (434回)-(2008/05/20(Tue) 12:23:20)
No19103 (れい さん) に返信
> ■No19096 (シャノン さん) に返信
>>これバグくさいなー。
> 
> pingの、ですね。

そうなのかな?
コンソールアプリは出力時に \r\n ではなく \n を使うべし、というガイドラインはどこかにあったっけ?
例えばここ
http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html
では、出力を受ける側で \r\r\n に対応してるけど。

> >>GetDecoderしてDecoder取っておかないと、文字が化けちゃいます。
>>
>>え、そうなの?
> 
> OutputEncodingがUTF-16なときに
> 3バイトの読み込みで返ってきたりしたら切れちゃいますよ。
> 必ず偶数まで読む、なんて保証はないですから。

なるほど。勉強勉強。

>>StreamReader を使うというのは良くわからんが。
> StreamReaderに折角「改行まで読む」というメソッドがあるのに使わないのはもったいないというだけです。

あー、ReadLine を非同期で呼べと。
非同期デリゲートは使おうと思わなかったなぁ。

というわけでれいさんのをパクった非同期デリゲート版。

private delegate string ReadLine();
private static void Ping3()
{
    using (Process p = new Process())
    {
        p.StartInfo.FileName = "ping.exe";
        p.StartInfo.Arguments = "127.0.0.1";
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.UseShellExecute = false;

        p.Start();

        for(;;)
        {
            ReadLine ln = p.StandardOutput.ReadLine;
            IAsyncResult ar = ln.BeginInvoke(null, null);
            ar.AsyncWaitHandle.WaitOne();
            string line = ln.EndInvoke(ar);
            if (line == null)
            {
                break;
            }

            Console.WriteLine(line);
        }
    }

    Console.WriteLine();
    Console.WriteLine("Complete");
}

やっぱり改行が \r\r\n になるおまけつき。

引用返信 編集キー/
■19116 / inTopicNo.19)  Re[5]: Processの標準出力をリアルタイム取得
□投稿者/ れい (559回)-(2008/05/20(Tue) 13:15:41)
No19106 (シャノン さん) に返信
> ■No19103 (れい さん) に返信
>>■No19096 (シャノン さん) に返信
> >>これバグくさいなー。
>>
>>pingの、ですね。
>
> そうなのかな?
> コンソールアプリは出力時に \r\n ではなく \n を使うべし、というガイドラインはどこかにあったっけ?

実際のpingのソースは知りませんが、
pingの標準出力をパイプ経由で開いて読むと
\r\r\nが返ってくるわけです。

おそらく、標準出力がテキストモードであることを忘れて\r\nを出力しちゃってる、と見るのが普通でしょう。
そうでなかったとしても、pingが\r\r\nを出しちゃってるのはほぼ確実で、
やっぱりpingのバグです。

パイプがバグもちで入力元がpingの時のみ\r\nを\r\r\nに変えてしまう、
なんて確率はほぼ0と見ていいでしょう。

pingが意図的に\rを出している、つまり仕様である可能性ももちろんありますが。
その場合理由が見えません。
引用返信 編集キー/
■19131 / inTopicNo.20)  Re[4]: Processの標準出力をリアルタイム取得
 
□投稿者/ ネタ好き (302回)-(2008/05/20(Tue) 14:15:54)
>pingが意図的に\rを出している、つまり仕様である可能性ももちろんありますが。
>その場合理由が見えません。
ほんとおかしな挙動ですよね。データの終了を判定するためにあるのかな?
でも何パケット送るかはpingプログラムは周知しているはずですから意味が無いような・・・
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -