作者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