본문 바로가기
개발 및 운영

CreatePipe에 PeekNamedPipe을 쓰지 마세요!

by Joseph.Lee 2020. 8. 7.

stackoverflow을 보면 가끔

 

CreatePipe로 pipe를 생성하고,

CreateProcess에다가 해당 Pipe를 넣어서,

stderr/stdout을 PeekNamedPipe로 데이터가 있는지 확인한다.

 

대충 해보면 작동하는거 같다..

하지만 모든 상황에 작동하는것은 아니다.

 

https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe

 

PeekNamedPipe function (namedpipeapi.h) - Win32 apps

Copies data from a named or anonymous pipe into a buffer without removing it from the pipe.

docs.microsoft.com

마소님... CreatePipe에서도 동작한다며...ㅠㅠ

 

일단...

ipconfig같은 명령의 경우 잘 동작하는듯 하다.

하지만 bcdedit 같은 명령의 경우 PeekNamedPipe는 성공하지만 total_bytes_avail 등 모든 출력 결과는 0 을 나타낸다.

 

생각한 대안으로써 WaitForSingleObject가 있을 수 있지만... Pipe에서는 동작하지 않는다. (항상 WAIT_OBJECT_0 을 반환한다.)

 

이래...저래... NamedPipe를 만들어서 주는것말고는 답이 없다...!!!!

 

========== 추가 ==========

 

Named Pipe를 써도 특정 상황에서 stdout/stderr 값을 못받아올때가 있다.
hProcess의 이벤트가 빨리 먹혀서 그런데 꼼수로 해결했다.

https://github.com/jc-lab/jcu-process

반응형

댓글