在我的应用程序中,我需要通过c ++代码执行大量的shell命令。我发现程序执行6000命令需要30多秒,这是不可接受的!有没有其他更好的方法来执行shell命令(使用c / c ++代码)?
//Below functions is used to set rules for
//Linux tool --TC, and in runtime there will
//be more than 6000 rules to be set from shell
//those TC commans are like below example:
//tc qdisc del dev eth0 root
//tc qdisc add dev eth0 root handle 1:0 cbq bandwidth
// 10Mbit avpkt 1000 cell 8
//tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth
// 100Mbit rate 8000kbit weight 800kbit prio 5 allot 1514
// cell 8 maxburst 20 avpkt 1000 bounded
//tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth
// 100Mbit rate 800kbit weight 80kbit prio 5 allot 1514 cell
// 8 maxburst 20 avpkt 1000 bounded
//tc class add dev eth0 parent 1:0 classid 1:3 cbq bandwidth
// 100Mbit rate 800kbit weight 80kbit prio 5 allot 1514 cell
// 8 maxburst 20 avpkt 1000 bounded
//tc class add dev eth0 parent 1:1 classid 1:1001 cbq bandwidth
// 100Mbit rate 8000kbit weight 800kbit prio 8 allot 1514 cell
// 8 maxburst 20 avpkt 1000
//......
void CTCProxy::ApplyTCCommands(){
FILE* OutputStream = NULL;
//mTCCommands is a vector<string>
//every string in it is a TC rule
int CmdCount = mTCCommands.size();
for (int i = 0; i < CmdCount; i++){
OutputStream = popen(mTCCommands[i].c_str(), "r");
if (OutputStream){
pclose(OutputStream);
} else {
printf("popen error!\n");
}
}
}
更新
我尝试将所有shell命令放入shell脚本中,让测试应用程序使用system(“xxx.sh”)调用此脚本文件。这次执行所有6000个shell命令条目需要24秒,少于我们之前的操作。但这仍然远远超出我们的预期!有没有其他方法可以将执行时间减少到不到10秒?
答案 0 :(得分:2)
所以,很可能(根据我在类似事物中的经验),大部分时间都花在启动运行shell的新进程上,shell中实际命令的执行时间非常短。 (实际上,在30秒内6000听起来并不太可怕)。
有多种方法可以做到这一点。我很想尝试将它们全部合并到一个shell脚本中,而不是运行单独的行。这将涉及将所有'tc'字符串写入文件,然后将其传递给popen()。
另一个想法是,如果你真的可以将几个字符串组合成一个执行,也许?
如果命令完整且可直接执行(即,执行程序不需要shell),您也可以自己执行fork
和exec
。这将节省创建shell进程,然后创建实际进程。
此外,您可以考虑并行运行少量进程,这在任何现代计算机上都可能会增加您拥有的处理器核心数量。
答案 1 :(得分:1)
你可以启动shell(/ bin / sh)并管理解析输出的所有命令。或者你可以创建一个Makefile,因为这可以让你更好地控制命令的执行方式,并行执行和错误处理。