Windows 콘솔 :
- 도구 A는 이진 데이터를 파일에 쓸 수 있지만 stdout을 사용하도록 지시하는 옵션은 없습니다.
- 도구 B는 stdin에서 이진 데이터를 읽고 정보를 처리 할 수 있습니다.
중간 파일을 사용하지 않고 B를 통해 A 파이프 출력을 얻는 방법은 무엇입니까?
다시 말해, Windows는 무엇과 동일 /dev/stdout
합니까?
-제로 엔
Windows 콘솔 :
중간 파일을 사용하지 않고 B를 통해 A 파이프 출력을 얻는 방법은 무엇입니까?
다시 말해, Windows는 무엇과 동일 /dev/stdout
합니까?
-제로 엔
답변:
Windows에는 / dev / stdout, CON에 대한 아날로그가 있습니다.
Microsoft의 "레거시 호환성"프로그램을 고려할 때 여전히 작동한다고 생각합니다.
아 .. 찾았어요 Microsoft 지원 에서는 예약 이름 목록을 제공합니다. 파일 이름을 이러한 이름으로 지정할 수 없으며 입력 또는 출력으로 사용될 때 특별한 의미를 갖습니다.
CON을 출력 장치로 사용하여 stdout에 보낼 수 있습니다.
목록 :
Name Function
---- --------
CON Keyboard and display
PRN System list device, usually a parallel port
AUX Auxiliary device, usually a serial port
CLOCK$ System real-time clock
NUL Bit-bucket device
A:-Z: Drive letters
COM1 First serial communications port
LPT1 First parallel printer port
LPT2 Second parallel printer port
LPT3 Third parallel printer port
COM2 Second serial communications port
COM3 Third serial communications port
COM4 Fourth serial communications port
Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe"
. 로그 파일없이 명령이 제대로 작동하지만 빌드 출력이 없습니다.
program > file.txt
) 리디렉션 되거나 파이프에서 (와 같이 다른 프로그램의 stdin에 데이터를 전달하기 위해) 사용될 수 없습니다 program | another_program
. CON에 기록 된 출력은 항상 표시됩니다. 정답은 "Windows에는 / dev / stdout에 해당하지 않습니다"
Windows는와 직접적으로 동일하지 않습니다 /dev/stdout
.
다음은 명명 된 파이프 를 만드는 C # 프로그램을 작성하려는 시도 이며, 프로그램 A에 파일 이름으로 제공 할 수 있습니다. .NET v4가 필요합니다.
(컴파일러는 .NET 런타임과 함께 제공되며 요즘 어떤 컴퓨터에 .NET이 없기 때문에 C #입니까?)
PipeServer.cs
using System;
using System.IO;
using System.IO.Pipes;
class PipeServer {
static int Main(string[] args) {
string usage = "Usage: PipeServer <name> <in | out>";
if (args.Length != 2) {
Console.WriteLine(usage);
return 1;
}
string name = args[0];
if (String.Compare(args[1], "in") == 0) {
Pipe(name, PipeDirection.In);
}
else if (String.Compare(args[1], "out") == 0) {
Pipe(name, PipeDirection.Out);
}
else {
Console.WriteLine(usage);
return 1;
}
return 0;
}
static void Pipe(string name, PipeDirection dir) {
NamedPipeServerStream pipe = new NamedPipeServerStream(name, dir, 1);
pipe.WaitForConnection();
try {
switch (dir) {
case PipeDirection.In:
pipe.CopyTo(Console.OpenStandardOutput());
break;
case PipeDirection.Out:
Console.OpenStandardInput().CopyTo(pipe);
break;
default:
Console.WriteLine("unsupported direction {0}", dir);
return;
}
} catch (IOException e) {
Console.WriteLine("error: {0}", e.Message);
}
}
}
다음과 같이 컴파일하십시오.
csc PipeServer.cs /r:System.Core.dll
csc
에서 찾을 수 있습니다 %SystemRoot%\Microsoft.NET\Framework64\<version>\csc.exe
예를 들어, 32 비트 Windows XP에서 .NET Client Profile v4.0.30319 사용 :
"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\csc.exe" PipeServer.cs /r:System.Core.dll
운영:
PipeServer foo in | programtwo
창 1에서 :
programone \\.\pipe\foo
창 2에서.
programone
이야기하는 pipe
이 함께 이루어집니다,\\.\pipe\foo
programone
데이터 출력이 끝나면 사용하던 출력 파일을 닫습니다. (클라이언트 측에서 파이프는 일반 파일과 같은 방식으로 작동합니다.) 그렇게하면 pipe.exe
보다 정확하게 pipe.CopyTo(...)
EOF에 도달하여 종료됩니다.
out
방향 () 방향 (stdin to pipe)으로 사용하면 처음 1 kB 이후 "Broken pipe"오류로 죽습니다. in
그러나 파이프를 stdout ( )으로 복사 할 때는 발생 하지 않으므로 프로그램에 영향을 미치지 않아야합니다. (그들은 패치를 환영합니다. )
grawity 의 답변을 바탕으로 여러 터미널 창을 사용하지 않고도 프로세스를 직접 시작할 수있는 확장 버전을 만들었습니다.
일반적인 사용법 :
PipeServer [in|out] [process name] [argument 1] [argument 2] [...]
그런 다음 문자열 "{pipe}"가 경로 재 지정 경로로 바뀝니다.
실제 예 :
PipeServer.exe in "C:\Keil\UV4\Uv4.exe" -b "C:\Project\Project.uvproj" -j0 -o "{pipe}"
이 명령 행은 예를 들어 Eclipse에 직접 삽입하여 특정 외부 빌더의 빌드 로그를 StdOut으로 경로 재 지정할 수 있습니다.
이것은 아마도 가장 좋은 것입니다 ...
Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit
. 인수 (파일 이름)가 없으면-logFile
콘솔에 출력을 인쇄해야하지만 그렇지 않습니다. CON (예-logFile CON
:-)을 추가 한 후 : –-