2012-10-29 27 views
6

Làm cách nào để ống dẫn stdout và stderr của quá trình xử lý giống nhau? Trên các hệ thống unix, nó khá dễ dàng, chỉ cần sử dụng createPipe và vượt qua đầu ghi là runProcess làm cả stdout và stderr. Trên Windows khó hơn:Làm cách nào để ống dẫn stdout và stderr của quá trình xử lý giống nhau?

  • Cả gói unix-compat lẫn Win32 đều không xuất được cách tạo ống.

  • openTempFile (có thể được sử dụng để mô phỏng đường ống) đặt chế độ sai trên Handle được tạo.

Edit: Để đưa ra một số bối cảnh nhiều hơn: Tôi muốn chạy một quá trình và có nó viết stdout và stderr của nó với cùng Handle, một cách cross-platform.

+0

Thú vị. Theo cách nào thì các quyền đó sai? Theo tài liệu hướng dẫn, 'xử lý' của' openTempFile' được tạo ra với sự cho phép 'ReadWrite', mà phải đủ cho một tiến trình khác (do cùng một người dùng chạy) để ghi vào nó. –

Trả lời

2

Bạn có thể sử dụng công cụ từ System.Process. Trong định nghĩa CreateProcess

std_in  :: StdStream,    --^How to determine stdin 
std_out  :: StdStream,    --^How to determine stdout 
std_err  :: StdStream,    --^How to determine stderr 

StdStream có constructor này:

data StdStream = UseHandle Handle 

Sau đó, vượt qua các đối tượng bạn thành lập để các createProcess hàm để chạy proc của bạn.

+0

Vấn đề là làm thế nào để tạo ra 'Xử lý' ở nơi đầu tiên. – tibbe

+0

'Xử lý' nào? Xử lý để stdout/stderr? – arrowd

+0

@arrowd Có, làm thế nào để bạn tạo ra các xử lý được chia sẻ từ nơi chúng tôi có thể đọc cả std_out và std_err? – mljrg

Các vấn đề liên quan