[英]Is there a cross-platform solution in C++ for creating an unique process?
[英]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.