2017-04-13 149 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

好的,再次感謝! –