原帖由 NewCore 于 2007-6-4 17:42 發(fā)表于 1樓
這里是http://linux.chinaunix.net/bbs/thread-899878-1-1.html的續(xù)貼,現(xiàn)在遇到了新的問題
問題如下: 我首先把stdout重定向到了一個文件a.out, 然后一個子進(jìn)程執(zhí)行system("tar > stdout"),把數(shù) ...
原帖由 NewCore 于 2007-6-4 18:24 發(fā)表于 3樓
to MMMIX
謝謝回復(fù)!
嗯,我記得在第一個帖子里,你就讓我用exec代替system,我也是這樣嘗試了,但是沒有解決問題啊!
我現(xiàn)在也可以用exec代替system,只是我想請問一下,是否用exec就可以把輸出重定向到文件,且是及時把結(jié)果寫到文件,而不是等到命令結(jié)束返回?
原帖由 MMMIX 于 2007-6-4 19:03 發(fā)表于 5樓
當(dāng)然可以,適當(dāng)?shù)脑O(shè)置緩沖模式就行了。甚至你還可以在打開文件的時候指定同步標(biāo)志,或者在寫完文件的時候手工刷新。
原帖由 anhongkui 于 2007-6-4 19:34 發(fā)表于 6樓
設(shè)置緩沖模式
行緩沖或者無緩沖
原帖由 NewCore 于 2007-6-4 21:48 發(fā)表于 7樓
大哥,你又給了我一線希望,請問你說得“適當(dāng)設(shè)置緩沖模式”能不能具體點(diǎn)?
“甚至你還可以在打開文件的時候指定同步標(biāo)志,或者在寫完文件的時候手工刷新。”能不能具體點(diǎn),同時我也在網(wǎng)上查一下。
...
原帖由 flw2 于 2007-6-5 12:44 發(fā)表于 14樓
摟住,我沒有別的意思,我只是希望你能描述的清楚一點(diǎn)。
原帖由 flw2 于 2007-6-5 12:46 發(fā)表于 15樓
我首先把stdout重定向到了一個文件a.out, 然后一個子進(jìn)程執(zhí)行system("tar > stdout"),把數(shù)據(jù)寫到文件a.out中,同時,主進(jìn)程read文件a.out,把命令執(zhí)行結(jié)果讀出來
fp = popen("tar ..",& ...
原帖由 flw2 于 2007-6-5 12:42 發(fā)表于 13樓
所有的緩沖如果不起作用,那么肯定是因?yàn)槟悴]有改變tar,也許tar是有緩沖的。
不知道為什么要這么干。
原帖由 langue 于 2007-6-6 08:07 發(fā)表于 20樓
這個任務(wù)用 shell 寫不好嗎?
原帖由 mirnshi 于 2007-6-6 09:53 發(fā)表于 21樓
最簡單的就是popen,如果有可能,可以自己摘抄一個popen。如果只能選擇system,而且>轉(zhuǎn)向不靈的,是不是可以采用|管道,經(jīng)由另一個你自己編寫的程序讀取stdin,然后通過unix-socket之類的傳給主控程序。文件 ...
原帖由 NewCore 于 2007-6-6 11:06 發(fā)表于 23樓
研究tar代碼中,支持自己裁減
我準(zhǔn)備把gzip解壓裁掉,然后在代碼里面自己用gzip解壓,保留tar的解包功能,得到解包后的文件名就OK了,還在實(shí)驗(yàn)中.
現(xiàn)在比較郁悶的是,這段代碼有些extern的函數(shù),先嘗試一下 ...
原帖由 flw2 于 2007-6-6 13:21 發(fā)表于 25樓
tar的輸出是什么?我覺得tar就是輸出一個目錄樹。
所以你要什么呢?目錄樹的結(jié)構(gòu)(名字而不是內(nèi)容)?
原帖由 flw2 于 2007-6-6 13:21 發(fā)表于 25樓
tar的輸出是什么?我覺得tar就是輸出一個目錄樹。
所以你要什么呢?目錄樹的結(jié)構(gòu)(名字而不是內(nèi)容)?
原帖由 NewCore 于 2007-6-6 13:33 發(fā)表于 26樓
我要內(nèi)容. 現(xiàn)在的問題是,我得不到.
原帖由 flw2 于 2007-6-6 14:31 發(fā)表于 29樓
tar會mkdir,你想得到dir名稱還是什么?
可能是因?yàn)椴涣私鈚ar,我真還不明白你要什么,我試圖努力看懂你說的,但是還是不明白。
你可以寫個函數(shù)聲明,我可以看看我會不會實(shí)現(xiàn)這個函數(shù)。
原帖由 flw2 于 2007-6-6 14:31 發(fā)表于 29樓
tar會mkdir,你想得到dir名稱還是什么?
可能是因?yàn)椴涣私鈚ar,我真還不明白你要什么,我試圖努力看懂你說的,但是還是不明白。
你可以寫個函數(shù)聲明,我可以看看我會不會實(shí)現(xiàn)這個函數(shù)。
原帖由 flw2 于 2007-6-6 15:12 發(fā)表于 32樓
呵呵,別用這么嚴(yán)重的詞,我明白你的意思了,你就是要文件名,但是卻不想完之后在出來,確實(shí)很奇怪。
你現(xiàn)在的問題是tar的輸出并沒有在文件出來的同時打印出來對嗎?
原帖由 flw2 于 2007-6-6 15:25 發(fā)表于 36樓
我知道了,通常tar是行緩沖的,但是當(dāng)你定向到文件a.out的時候成為全緩沖了。
原帖由 flw2 于 2007-6-6 15:27 發(fā)表于 37樓
定向到管道也沒有用。如果你非要立馬取結(jié)果,那么我現(xiàn)在暫時有兩種辦法
1.偽終端
2.該tar的代碼
1不需要改代碼,但是需要稍微折騰一下。
2很簡單
原帖由 flw2 于 2007-6-6 15:28 發(fā)表于 38樓
樓主
你的條件,不能等待是很嚴(yán)格嗎?要不結(jié)束之后再遍歷一下多簡單
原帖由 flw2 于 2007-6-6 15:37 發(fā)表于 42樓
很好辦,它確實(shí)是到輸出,直接
main開頭,setbuf(stdout,NULL);
原帖由 NewCore 于 2007-6-6 15:40 發(fā)表于 44樓
這個我試過了阿,本貼中,我貼出來的代碼就做過這樣的嘗試啊....
原帖由 flw2 于 2007-6-6 15:43 發(fā)表于 46樓
老大,這個要在tar的main函數(shù)中,
原帖由 flw2 于 2007-6-6 15:44 發(fā)表于 47樓
我有源碼,這些不都是公開的嗎。busybox里的tar也有個main函數(shù)呀,你在關(guān)鍵地方檢察一下,比如
if (argv == "tar")
setbuf NULL
原帖由 flw2 于 2007-6-6 15:54 發(fā)表于 52樓
放在tar_main不一定可以,如果以前沒有printf確實(shí)可以
你要是很自由的改代碼,直接main函數(shù)前面加個setbuf也沒有什么關(guān)系
不過個人認(rèn)為你的做法實(shí)在是不可取
原帖由 NewCore 于 2007-6-6 16:00 發(fā)表于 53樓
這作為最后的辦法把,我現(xiàn)在還是先把tar搞到我自己的代碼里,這樣應(yīng)該是現(xiàn)在比較合適的解決辦法了.
多謝你的回復(fù),遇上這樣的問題,郁悶死我了,都說蠻簡單個事,我做了一個星期了....
原帖由 MMMIX 于 2007-6-6 16:16 發(fā)表于 54樓
因?yàn)槟阋恢眻?jiān)持要用 system 函數(shù)。
原帖由 NewCore 于 2007-6-6 16:19 發(fā)表于 55樓
![]()
老大說的是,我承認(rèn)我可能是有點(diǎn)轉(zhuǎn)牛角尖了,但是system并不是問題的關(guān)鍵吧...
原帖由 mirnshi 于 2007-6-6 19:25 發(fā)表于 57樓
用unix-socket,測試了一下,可以得到輸出。
server: 打開socket, system執(zhí)行客戶端,等待客戶端的輸入
client: 打開socket,建立連接,然后復(fù)制到0,1,2句柄上,再exec執(zhí)行tar,服務(wù)端就可以讀到tar的輸出了。
歡迎光臨 Chinaunix (http://72891.cn/) | Powered by Discuz! X3.2 |