簡體   English   中英

跨平台重定向本機C / C ++中生成的過程的標准輸入和輸出(使用解決方案進行編輯)

[英]Cross-platform redirect of standard input and output of spawned process in native C/C++ (edit with solution)

我有一個字符串命令,我想在寫入其輸入和讀取其輸出時異步執行。 聽起來很容易,對,魔鬼在跨平台中。 我的目標是同時使用MSVC / Win32和gcc / Linux,顯然想編寫最少數量的平台特定代碼。 我的google-fu讓我失敗了,我的查詢太多了,所以我從我所知道的開始。

popen-簡單易用,返回易於在任何地方使用的FILE *。 但是,這是MSDN關於_popen不得不說的

如果在Windows程序中使用_popen函數,它將返回一個無效的文件指針,該指針會導致程序無限期地停止響應。 _popen在控制台應用程序中正常工作。 要創建重定向輸入和輸出的Windows應用程序,請參閱Platform SDK中的使用重定向的輸入和輸出創建子進程。

因此popen成為不可能(編輯:因為我希望我的代碼在GUI應用程序中工作)。 我認為Windows的實現方法相當丑陋且冗長。 我可以使用特定於平台的衍生代碼,但我至少希望I / O代碼相同。 但是,在這里,我碰到了WinAPI HANDLE和C FILE*以及int文件描述符之間的障礙。 有沒有辦法將“ HANDLE ”轉換為FILE*int fd,反之亦然? (Google再次使我失敗了,我嘗試過的所有關鍵字都被過度使用了)

有沒有更好的方法可以用很少的平台特定代碼來完成整個工作?

外部庫並不是沒有問題,但是依賴關系維護很麻煩,尤其是在多個平台上,因此我想減少依賴關系。 我也沒有在Boost中找到這樣的庫。


僅作記錄,最終對我有用。 在Windows / MSVC, CreatePipe() + CreateProcess()作為概括這里 ,使用_open_osfhandle()然后_fdopen()獲得FILE*的過程輸入和輸出。 在Linux / GCC上,這里沒有新內容,創建pipe() fork()然后dup2()管道; exec() ; 有關文件描述符的fdopen() 這樣,只有進程產生代碼是平台相關的(沒關系,就像Windows一樣,我想控制其他STARTUPINFO參數),寫入輸入和讀取輸出是通過標准FILE*和相關功能完成的。

libexecstream一個旋轉。 它是跨平台的,允許您以C ++樣式流的形式異步捕獲進程的輸入,輸出和錯誤流。

我已經在Linux,Darwin和Windows上使用過它,而且似乎可以正常工作。 它也很輕巧,因此可以輕松集成到項目中,並且具有相當開放的BSD許可證。 我認為沒有任何辦法可以使用庫(除了為每個平台編寫自己的變體)。

用於將Windows HANDLE轉換為C文件描述符,請使用_open_osfhandle http://msdn.microsoft.com/zh-cn/library/bdts1c9x%28VS.71%29.aspx

編輯:這個例子曾經幫助我也解決了類似的問題: http : //www.halcyon.com/~ast/dload/guicon.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM