亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12345下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 8161 | 回復(fù): 45
打印 上一主題 下一主題

如何更巧妙的利用shell的fd [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-01-06 20:03 |只看該作者 |倒序?yàn)g覽
建議大家先看看這個(gè)鏈接,此帖完全是因受它啟發(fā),甚至可說(shuō)是它的續(xù),只因兩貼的討論偏重于不同方向,所以令開(kāi)一帖

http://72891.cn/viewthr ... p;extra=&page=1

上面一帖,r2007兄的shell版本,遺留了一個(gè)問(wèn)題沒(méi)有解決,就是如何讓截?cái)辔募蔷浍@得我們希望它截?cái)辔募奈恢,而不是用?jì)算文件大小來(lái)獲得。下面是我的兩種解法


  1. exec 3<"$1" 4<>"$1" 5<"$1"
  2. head -10 <&3;head -10 <&5
  3. dd <&3 >&4
  4. :|dd of="$1" obs=$(wc -c <&5) seek=1
  5. exec 3<&- 4>&- 5<&-
復(fù)制代碼

  1. exec 3<"$1" 4<>"$1" 5<"$1"
  2. head -10 <&3
  3. dd <&3 >&4
  4. :|dd of="$1" obs=$(($(wc -c <&5)-$(wc -c <&4))) seek=1
  5. exec 3<&- 4>&- 5<&-
復(fù)制代碼


兩個(gè)地方可能需要解釋
  1. dd <&3 >&3
復(fù)制代碼

此處,由于fd3保存了head命令保存在其中,指向第11行開(kāi)頭的文件指針。而fd4中仍然保存著指向文件頭的文件指針。
因此,此句利用了兩個(gè)文件指針錯(cuò)位,以及fd4是以讀寫(xiě)方式打開(kāi)的,將11行后的內(nèi)容寫(xiě)從第1行到倒數(shù)第11行,文件最后10行內(nèi)容未變。執(zhí)行結(jié)束,fd3保存的文件指針指向文件尾,fd4的指向倒數(shù)第10行頭。
  1. wc -c <&5
復(fù)制代碼
此句將獲得fd5所保存的文件指針到fd5打開(kāi)文件的文件尾的字節(jié)數(shù)。

這里仍然需要計(jì)算obs,是因?yàn)槲以趕hell下實(shí)在找不到另外的辦法截?cái)辔募耍▏L試過(guò)向指向某位置的fd寫(xiě)入文件結(jié)束符或空字符,都無(wú)效~究竟還有沒(méi)有別的方法呢?請(qǐng)大家指教)。但計(jì)算obs的方式畢竟變成了利用文件指針來(lái)獲得,不再需要從外部來(lái)獲得,也算一些進(jìn)步吧~。
而且,更有價(jià)值的是,上面兩種方法,效率進(jìn)一步提高,當(dāng)處理seq 10000000生成的文件時(shí),其效率是perl方法的10倍,文件越大,效率差將越大。

上面的內(nèi)容主要還是續(xù)woodie兄那帖,下面該討論下本帖的問(wèn)題了。
除了我代碼中的head和錯(cuò)位文件指針讀寫(xiě),還有設(shè)置dd的操作數(shù),另外還有其他的準(zhǔn)確定位文件指針的方法么?
我想到了sed的q命令,如果能利用它來(lái)準(zhǔn)確定位,那么效率和應(yīng)用寬度都將非常理想。可惜
  1. exec 3<file
  2. sed '1q' <&3
  3. cat <&3
  4. exec 3<&-
復(fù)制代碼
并不像我所想cat打印出除第一行外的其他行,看來(lái)q命令還做了一些不為我們所知的動(dòng)作,導(dǎo)致sed處理過(guò)的fd,其保存的文件指針都指向了文件尾。

又想到了while read
  1. exec 3<file
  2. while read i
  3. do
  4.         ((n++))
  5.         echo $i
  6.         [ $n -eq 5 ] && break
  7. done <&3
  8. echo
  9. echo
  10. cat <&3
  11. exec 3<&-
復(fù)制代碼

這種方法成功,可惜shell的while效率實(shí)在不好,也有瑕疵。

結(jié)論:
1. 在測(cè)試中發(fā)現(xiàn),5<&3復(fù)制的fd,和dup系統(tǒng)調(diào)用一樣,其文件指針是共享的,即對(duì)fd3的文件指針進(jìn)行定位,fd5的文件指針也將改變。
2. head和dd用來(lái)準(zhǔn)確定位fd的文件指針,從效率和代碼復(fù)雜程度上考慮都很不錯(cuò),可惜只能以具體字節(jié)或行數(shù)作為定位條件。
while read的方法可以使用更復(fù)雜的定位條件,可惜效率太差。

遺留問(wèn)題:
1. shell下有否其他的方法截?cái)辔募?br /> 2. 有否其他準(zhǔn)確定位fd文件指針的方法?甚或可以兼顧效率和復(fù)雜的定位條件。

[ 本帖最后由 一夢(mèng)如是 于 2007-1-7 10:47 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2007-01-06 20:10 |只看該作者
夢(mèng)帥的1000帖果然不同凡響....可惜我先水一下吧...肥水不流外人田啊...等下寫(xiě)心得體會(huì)^_^

論壇徽章:
7
榮譽(yù)版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07獅子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10雙子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
3 [報(bào)告]
發(fā)表于 2007-01-07 12:07 |只看該作者

回復(fù) 1樓 一夢(mèng)如是 的帖子

wc -c <&5
這句又掃描了一遍原文件,影響效率,值得商榷。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2007-01-07 14:42 |只看該作者
原帖由 r2007 于 2007-1-7 12:07 發(fā)表
wc -c <&5
這句又掃描了一遍原文件,影響效率,值得商榷。


用大小為10bytes和3GB的文件分別測(cè)試了一下,使用的real_time幾乎沒(méi)區(qū)別

strace一下它

  1. $strace wc -c <FC-6-i386-DVD.iso 2>&1|tail -12
  2. fstat64(0, {st_mode=S_IFREG|0755, st_size=3525195776, ...}) = 0
  3. _llseek(0, 0, [0], SEEK_CUR)            = 0
  4. _llseek(0, 0, [3525195776], SEEK_END)   = 0
  5. fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
  6. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c24000
  7. close(0)                                = 0
  8. write(1, "3525195776\n", 113525195776
  9. )            = 11
  10. close(1)                                = 0
  11. munmap(0xb7c24000, 4096)                = 0
  12. exit_group(0)                           = ?
  13. Process 6560 detached

復(fù)制代碼

發(fā)現(xiàn)wc -c只讀取了文件的前4096字節(jié)(見(jiàn)mmap那行調(diào)用),又與stat命令的strace信息相對(duì)照,wc -c應(yīng)該只是通過(guò)fd指向的文件表項(xiàng)和v節(jié)點(diǎn)表來(lái)獲得字節(jié)數(shù)(參見(jiàn)APUE圖3-2及相關(guān)內(nèi)容)
因此,文件的大小對(duì)wc -c的效率幾乎沒(méi)有影響(但wc -l、wc -w都會(huì)循環(huán)調(diào)用read(2),因此它們的效率是會(huì)受到文件大小影響的)

但r2007兄的提醒讓我想到了head,它恐怕是要直接調(diào)用read(2)的,果不其然,strace信息證明了:無(wú)論是-c還是-n選項(xiàng),都循環(huán)調(diào)用了read(2)。
所以,可能隨文件大小或文件定位影響我代碼效率的,除了中間那句明顯的dd讀寫(xiě)外,就是這句head了。
這樣,也說(shuō)明了從效率上考慮,我第二段代碼比第一段代碼稍優(yōu)一些(因?yàn)樯儆昧艘淮蝖ead)。

論壇徽章:
7
榮譽(yù)版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07獅子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10雙子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
5 [報(bào)告]
發(fā)表于 2007-01-07 17:23 |只看該作者
不熟悉strace,不過(guò)從道理上wc應(yīng)該比head快。wc -c不關(guān)心內(nèi)容而只關(guān)心大小,head必須要實(shí)際讀取內(nèi)容,因?yàn)檫@是它的結(jié)果。

dd的輸出,如:
x+y records in
m+n records out
沒(méi)有文檔描述其含義,而且不知道各版本是否一致,否則有可能利用這個(gè)輸出算出截?cái)嗟膐ffset.

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2007-01-07 17:29 |只看該作者
r2007兄還有否其他的shell方法截?cái)辔募?/td>

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2007-01-07 17:40 |只看該作者
怎么象天書(shū)了。。。還沒(méi)用過(guò)這樣的東西
還沒(méi)看完,有點(diǎn)不懂了:
  1. head -10 <&3
  2. 。。。
  3. 此處,由于fd3保存了head命令保存在其中,指向第11行開(kāi)頭的文件指針
復(fù)制代碼
  1. $ cat test
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 12
  14. 13
  15. 14
  16. 15
  17. 16
  18. 17
  19. 18
  20. 19
  21. 20
  22. 21
  23. 22
  24. 23
  25. 24
  26. 25
  27. 26
  28. 27
  29. 28
  30. 29
  31. 30
  32. $
  33. $ exec 7<test
  34. $ head -10 <&7
  35. 1
  36. 2
  37. 3
  38. 4
  39. 5
  40. 6
  41. 7
  42. 8
  43. 9
  44. 10
  45. $ head -10 <&7
  46. $
復(fù)制代碼

第2個(gè) head -10 <&7怎么沒(méi)東西了啊

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2007-01-07 17:49 |只看該作者
您使用的是什么系統(tǒng)?什么版本?
看來(lái)是您系統(tǒng)的head與我系統(tǒng)的在對(duì)文件指針的行為上不同
依您提供的信息,您系統(tǒng)的head是定位到文件尾了。

哎,標(biāo)準(zhǔn)化是多么重要阿~

[ 本帖最后由 一夢(mèng)如是 于 2007-1-7 18:01 編輯 ]

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2007-01-07 18:01 |只看該作者
原帖由 一夢(mèng)如是 于 2007-1-7 17:49 發(fā)表
汗,什么系統(tǒng)?什么版本?

是不是如果是可用的話,第2個(gè)head 就該打印出11-20了?
我用的HP-UX,到現(xiàn)在還不知道怎么sed之流看版本

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2007-01-07 18:35 |只看該作者
是的,我這里是打印出11-20行的。
類(lèi)UNIX的awk、sed、grep似乎都是沒(méi)有版本一說(shuō)的
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP