有關C的Pipe跟waitpid

本帖最後由 神秘二代 於 2014-10-12 02:17 編輯

最近才學...有點不明白....
我像是這樣寫....
int cid;
預備一定數量的pipe
入cmd, split to array
do{
fetch cmd one by one
cid = fork();
if(cid ==0){
execl(xxx.....);
}else{
waitpid(cid, NULL, 0);
}
}while(cid > 0);

問題是當我輸入 ls | grep a時....會在第二個卡住了...都一直在等....求指教....?
  1. Test> ls | grep a
  2. wait response....pid: 23821
  3. finish response....pid: 23821
  4. wait response....pid: 23822
  5. Downloads
  6. examples.desktop
  7. Templates
複製代碼
另外想問...如何令split出來的會trim左右的空白?
"aaa , bbbb, xxxx"
[1] aaa
[2]  bbb
[3]  xxx
這個空白令我很困擾....Orz

其實唔係好明想做乜...
但...點解有個DO WHILE LOOP係最外邊既?
EXAMPLE..
http://www-h.eng.cam.ac.uk/help/tpl/unix/fork.html

TOP

本帖最後由 dsscss 於 2014-10-12 15:02 編輯

Here is how linux kernel does the trimming, called strstrip():
http://stackoverflow.com/questio ... railing-spaces-in-c

How do I trim leading/trailing whitespace in a standard way?
http://stackoverflow.com/questio ... e-in-a-standard-way

TOP

Do while係因為我想處理client不同的輸入
例如 ls -l | grep a
ls -l | grep b | wc -n
如果用固定的pipe無法處理in and out
所以我會斬開做一個array, 再跟據array大小gen個pipe
之後由頭做到尾...一直in/out/exec...
但問題係佢做到第二個就卡住了.....

TOP

但問題係佢做到第二個就卡住了.....
神秘二代 發表於 2014-10-12 18:04


可能係無close完咗ge pipe,
例如ls -l個process完咗,但係你無close咗佢條output pipe,
咁grep就會以為input仲未完,卡住喺到等新input

TOP

同埋成個structure好似有d問題...
你咁寫, 只有前一個process完咗之後, 先會fork新ge process.
其實應該fork晒全部process, 再喺while loop外面一次過waitpid

TOP

同埋成個structure好似有d問題...
你咁寫, 只有前一個process完咗之後, 先會fork新ge process.
其實應該for ...
KoolFreeze 發表於 2014-10-12 21:37


咁樣做唔到dynamic效果?
佢個cmd 點寫架...其實而家都係simulate去學習~_~

TOP

相關文章