2017-04-13 256 views
0

我有一个大学的任务,我需要从管道读取一个bash命令并执行这个命令。我正在考虑使用execv *,因为我可以通过将空格分隔为分隔符来创建缓冲区。问题是我不能使用STL库,我不知道如何创建这个缓冲区,因为这个缓冲区的大小是可变的。有什么建议么?在此先感谢execv的缓冲区大小

+0

选择适当的高上限,做一个传球第一的来算,所以你知道你需要多少,或者通过malloc'ing一个实现自己的可增长矢量更大的区域并在您需要更多时间将数据复制到它。 –

+0

是的,我正在考虑高的上限,但我不知道什么上限应该是xD。对于可生长的矢量,我在想,为了实现这一点,我需要读两次文本,一次用于计数,一次用于添加到缓冲区。 –

+0

你可以选择128k或者其他足够大的东西,这样你就不太可能在任务中遇到它(128k是Linux execve的传统字节大小限制)。如果你先计算一下,你甚至不需要增长它,因为你已经知道这个尺寸,而且工作。增长只会追加到一个大小为N的缓冲区,如果您达到N,您只需分配一个2 * N的值,复制所有元素,并继续添加。 –

回答

2

如果你像下面只有一个管道命令,缓冲区大小30就足够了,更

ls -l | wc -l 

但是你可以支持多个管道命令,你会得到像波纹管的命令,和你缓冲区大小必须足够它

cat index.html | grep ".com" | grep ".splunk." | cut -d "<" -f2 | cut -d ">" -f1 | grep ":" | cut -d":" -f2 | cut -d "/" -f3 | cut -d " " -f1 | grep ".splunk." | cut -d '"' -f1 | sort | uniq 

你的缓冲区的大小应该是100,我选用的大小100对我的操作系统项目,像你这样的,我们实现了一个终端,它支持几乎所有的东西,多管道,重定向如...

另外,我用execvp像下面,

execvp(args[0], &args[0]); 
+0

谢谢你的回答。 是否有任何特定的原因,100是足够的管道? –

+0

不,没有什么具体原因,我说我的终端支持这个门槛值,我觉得这个价值够了,但是你可以实现任意大小,没有限制去做 –

+0

好的,再次感谢! –