作者shooter555 (shooter)
看板LinuxDev
標題[問題] Linux C下, 如何使用shell, 並等待grandchild process?
時間Fri Dec 23 12:04:07 2011
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
1F:推 mimi0213:wait() 12/23 22:32
2F:→ shooter555:wait()是用來等待fork所產生的subprocess而已 不是嗎? 12/25 14:47
3F:→ buganini:自己寫程式把AB包起來 P跟AB的殼做IPC 12/25 14:55
4F:→ buganini:其中最難包的應該是B 如果他不只是用來執行的話.. 12/25 14:56
5F:→ buganini:或是說如果你能取得B的pid的話 就可以直接用kernel 12/25 14:58
6F:→ buganini:機制來做 12/25 14:58
7F:→ shooter555:可是我無法取得A, B的source code 所以應該辦法把兩隻 12/26 09:48
8F:→ shooter555:單獨的執行檔包起來吧 12/26 09:48
9F:→ shooter555: 沒 12/26 09:48
10F:→ shooter555:我也想過直接取得B的Pid, 可是好像唯一辦法只能透過ps 12/26 09:52
11F:→ shooter555:指令, 然後grep name去找到它, 不過如果同時存在很多的 12/26 09:53
12F:→ shooter555:B的話, 就沒辦法了... 12/26 09:54
13F:→ buganini:所謂包起來就是不需要source code啊 自己用一個 12/26 11:04
14F:→ buganini:launcher去代替真正的B 這樣這個程式就會知道B的pid了 12/26 11:07
15F:→ buganini:簡單說就是你要在A/B之間塞自己的一層 12/26 11:08
16F:→ shooter555:這個方法好像可行喔!!意思是說我寫一隻假的Launcher來 12/26 11:39
17F:→ shooter555:騙A, 然後取得所有的參數以後, 在用這隻launcher去叫起 12/26 11:40
18F:→ shooter555:原本的B, 同時取得pid, 只是不知要怎樣將這pid傳回"P", 12/26 11:41
19F:→ shooter555:我先試試看這方法好了, 感謝大大指點!! 12/26 11:44
20F:→ shooter555:結果...還是無法讓P程式與那隻launcher做資料溝通... 12/28 14:15
21F:→ buganini:兩個程式都自己寫的就可以找其他手段做IPC啦 12/28 17:46
22F:→ buganini:在P開好pipe 把fd藏在環境變數 launcher就知道怎麼傳了 12/28 17:48
23F:→ shooter555:感謝大大!!我有找到一個方法了, 開socket來傳訊息, 先 12/30 13:15
24F:→ shooter555:開一個socket manager來管理所有的連結P跟Launcher的 12/30 13:16
25F:→ shooter555:socket, 然後利用這個manager來媒合P跟Launcher(因為P 12/30 13:18
26F:→ shooter555:跟Launcher or B都是multiple), 這樣就能讓兩個溝通了 12/30 13:20
27F:→ shooter555:P1 <一> launcher1, p2 <一> launcher2 ...... 12/30 13:21