[問題] Linux C下, 如何使用shell, 並等待grandchild process?

看板LinuxDev作者 (shooter)時間13年前 (2011/12/23 04:04), 編輯推噓1(1026)
留言27則, 3人參與, 最新討論串1/1
Dear all, 標題可能有點不清楚, 我再重新闡述我的問題, 我想要在linux環境下, 使用C/C++(or QT)來call外部的執行檔A, 而caller process就稱為"P"好了 而這個執行檔"A"本身自己會在去呼叫另一隻執行檔"B"起來, 然後"A"就結束了, "B"會持續運作, 但我想讓"P"阻塞, 等到執行檔"B"結束才停止阻塞, 但無論使用popen, QProcess::execute/start, 都似乎無法達成, 但如果使用python的command.getstatusoutput()去呼叫執行檔"A", 卻能達成這個目的, 另外一提, 執行檔"A", "B"都是非open source, 所以我無法修改更動, 所以想請問各位大大, 不知道對於這個問題, 有沒有什麼好的想法, 利用Linux環境下的C/C++. 謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.51.84

12/23 22:32, , 1F
wait()
12/23 22:32, 1F

12/25 14:47, , 2F
wait()是用來等待fork所產生的subprocess而已 不是嗎?
12/25 14:47, 2F

12/25 14:55, , 3F
自己寫程式把AB包起來 P跟AB的殼做IPC
12/25 14:55, 3F

12/25 14:56, , 4F
其中最難包的應該是B 如果他不只是用來執行的話..
12/25 14:56, 4F

12/25 14:58, , 5F
或是說如果你能取得B的pid的話 就可以直接用kernel
12/25 14:58, 5F

12/25 14:58, , 6F
機制來做
12/25 14:58, 6F

12/26 09:48, , 7F
可是我無法取得A, B的source code 所以應該辦法把兩隻
12/26 09:48, 7F

12/26 09:48, , 8F
單獨的執行檔包起來吧
12/26 09:48, 8F

12/26 09:48, , 9F
12/26 09:48, 9F

12/26 09:52, , 10F
我也想過直接取得B的Pid, 可是好像唯一辦法只能透過ps
12/26 09:52, 10F

12/26 09:53, , 11F
指令, 然後grep name去找到它, 不過如果同時存在很多的
12/26 09:53, 11F

12/26 09:54, , 12F
B的話, 就沒辦法了...
12/26 09:54, 12F

12/26 11:04, , 13F
所謂包起來就是不需要source code啊 自己用一個
12/26 11:04, 13F

12/26 11:07, , 14F
launcher去代替真正的B 這樣這個程式就會知道B的pid了
12/26 11:07, 14F

12/26 11:08, , 15F
簡單說就是你要在A/B之間塞自己的一層
12/26 11:08, 15F

12/26 11:39, , 16F
這個方法好像可行喔!!意思是說我寫一隻假的Launcher來
12/26 11:39, 16F

12/26 11:40, , 17F
騙A, 然後取得所有的參數以後, 在用這隻launcher去叫起
12/26 11:40, 17F

12/26 11:41, , 18F
原本的B, 同時取得pid, 只是不知要怎樣將這pid傳回"P",
12/26 11:41, 18F

12/26 11:44, , 19F
我先試試看這方法好了, 感謝大大指點!!
12/26 11:44, 19F

12/28 14:15, , 20F
結果...還是無法讓P程式與那隻launcher做資料溝通...
12/28 14:15, 20F

12/28 17:46, , 21F
兩個程式都自己寫的就可以找其他手段做IPC啦
12/28 17:46, 21F

12/28 17:48, , 22F
在P開好pipe 把fd藏在環境變數 launcher就知道怎麼傳了
12/28 17:48, 22F

12/30 13:15, , 23F
感謝大大!!我有找到一個方法了, 開socket來傳訊息, 先
12/30 13:15, 23F

12/30 13:16, , 24F
開一個socket manager來管理所有的連結P跟Launcher的
12/30 13:16, 24F

12/30 13:18, , 25F
socket, 然後利用這個manager來媒合P跟Launcher(因為P
12/30 13:18, 25F

12/30 13:20, , 26F
跟Launcher or B都是multiple), 這樣就能讓兩個溝通了
12/30 13:20, 26F

12/30 13:21, , 27F
P1 <一> launcher1, p2 <一> launcher2 ......
12/30 13:21, 27F
文章代碼(AID): #1Ey_swWA (LinuxDev)