#include #include "util/pipestream.h" using namespace std; int main(int argc, char *argv[]){ cerr << "Usage: " << argv[0] << " command_spec" << endl; cerr << "Ex) " << argv[0] << " ls" << endl; if(argc <= 1){ cerr << "command spec unspecified!!" << endl; exit(-1); } try{ PipeStream pipe_io(argv[1]); char buf[1]; while(pipe_io.good()){ pipe_io.read(buf, sizeof(buf)); if(pipe_io.gcount() < 1){continue;} cout << buf[0]; } }catch(exception &e){ cerr << e.what() << endl; } return 0; } #if 0 #define DEBUG(x) #define R 0 #define W 1 #define MAX_LEN 4096 int main(){ HANDLE hPipe[2]; SECURITY_ATTRIBUTES secAtt; STARTUPINFO startInfo; PROCESS_INFORMATION proInfo; char buf[MAX_LEN]; DWORD readLen; /* unsigned int */ BOOL bChk; // SECURITY_ATTRIBUTES の設定(パイプを作るのに必要) secAtt.nLength = sizeof(SECURITY_ATTRIBUTES); secAtt.lpSecurityDescriptor = NULL; secAtt.bInheritHandle = TRUE; // ハンドル継承 /* パイプ作成 要は新しいハンドルを作成 */ if(CreatePipe(&hPipe[R], // 読み込み用ハンドル &hPipe[W], // 書き込み用ハンドル &secAtt, // ? 0 // バッファのサイズ ) == 0){ printf("error"); exit(-1); } /* 子プロセスの起動時の情報 * これを設定しないと, コンソール系プロセスでは, * コンソールが立ち上がる。 */ memset(&startInfo,0,sizeof(STARTUPINFO)); startInfo.cb = sizeof(STARTUPINFO); // 構造体の大きさ; startInfo.dwFlags = STARTF_USEFILLATTRIBUTE | STARTF_USECOUNTCHARS | STARTF_USESTDHANDLES | /*ハンドルを継承するメンバ*/ STARTF_USESHOWWINDOW, // どのメンバが有効か startInfo.wShowWindow = SW_HIDE; // ウィンドウ表示のパラメータ; startInfo.hStdOutput = hPipe[W]; // 子の出力はこのプロセスの入力へ // hStdInput = GetStdHandle( STD_INPUT_HANDLE ); if(CreateProcess(NULL,"echo.exe hoge",NULL,NULL,TRUE, 0,NULL,NULL,&startInfo,&proInfo)==TRUE){ // 子プロセスが終るまで停止 WaitForSingleObject(proInfo.hProcess,INFINITE); DEBUG(MessageBox(NULL,"hi","hi",MB_OK)); // 子からきたメッセージを読む bChk = ReadFile(hPipe[R],buf,sizeof(buf),&readLen,NULL); if ( ! bChk ) { printf("ReadFileにてエラーが発生しました"); } else { buf[readLen] = '\0'; printf("子からメッセージ %s", buf); } }else{ printf("error\n"); } CloseHandle(hPipe[R]); CloseHandle(hPipe[W]); return 0; } #endif