DOSのパイプを使うプログラム
OpenCVを使ってUSBカメラから本などのバーコードを読みとれないかと思ったり。
GUIとかなくても、CUIでバーコードを読み取ったらコンソールにその番号を出力して、パイプを使ってISDNコードから本のデータを取得するプログラムに渡すってことをすればいんじゃね、と考えたところで、ふと「DOSのパイプって、どうやってプログラムから読みとればいいんだ?」と思いついた。
検索してみると@ITの「.NET TIPS 標準入力(パイプ)からテキストを読み込むには?[C#、VB]」があった。
なるほど、標準入力(Console.In.ReadLine())で読み取っていくのか。
キーボートからの文字入力と同じ仕組みなんね。
上記のページのプログラムでは、標準入力(Console.In.ReadLine())がnllではないとき、ループし続ける。つまり、入力が続く限りプログラムは終了しない。
では、パイプで受け取る方がさっさと終わってしまったら、パイプで受け渡す方はどうなるんだろう?もしくは、受け渡す方が終わってしまうと受け取る側はどうなるの?
というわけで、C#で以下のプログラムを書いて試してみた。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TextReader input;
string line;
// 読み込み元は標準入力
input = Console.In;
Process proc = Process.GetCurrentProcess();
while ((line = input.ReadLine()) != null)
{
Console.WriteLine("{0} : {1}", line, proc.Id);
if (args.Length == 1 && args[0] == "1")
{
break;
}
}
input.Dispose();
}
}
}
プロセスIDを出しているのは余興。
これで
test.exe | test.exe 1
として、キーボードから文字入力してEnterとすると
a
a : 3512 : 4568
a
となって、1回パイプ受取先の出力されたあとは、パイプ出力元の出力が出ない。パイプ受取先がないので標準出力が処理されず消えてしまうのか。
次に、
test.exe 1 | test.exe
として、キーボードから文字入力してEnterとすると
a
a : 3640 : 5016
これで終了してしまう。パイプ出力元が終了するとコマンドが終了してしまうということが分かりました。
おしまい。
« 金を貰う限りはプロたれ | トップページ | 朝日新聞に載っていた2つの「言葉」 »
コメント