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

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

Chinaunix

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

file redirection [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-09-24 14:27 |只看該作者 |倒序?yàn)g覽
    在linux紛繁復(fù)雜的內(nèi)核代碼中,sys_dup()的代碼也許稱得上是最簡(jiǎn)單的之一了,但是就是這么一個(gè)簡(jiǎn)單的系統(tǒng)調(diào)用,卻成就了unix/linux系統(tǒng)最著名的一個(gè)特性:輸入/輸出重定向
    sys_dup()的主要工作就是用來(lái)“復(fù)制”一個(gè)打開(kāi)的文件號(hào),使兩個(gè)文件號(hào)都指向同一個(gè)文件。既然說(shuō)簡(jiǎn)單,我們就首先來(lái)看一下它的代碼(定義在fs/fcntl.c中):
187  asmlinkage long sys_dup(unsigned int fildes)
188  {
189      int ret = -EBADF;
190      struct file * file = fget(fildes);
191  
192      if (file)
193          ret = dupfd(file, 0);
194      return ret;
195  }
而sys_dup()的主體是dupfd()(定義在同一個(gè)文件中):
116  static int dupfd(struct file *file, int start)
117  {
118      struct files_struct * files = current->files;
119      int ret;
120  
121      ret = locate_fd(files, file, start);
122      if (ret file_lock);
129      fput(file);
130      return ret;
131  }
    而這么一個(gè)簡(jiǎn)單的系統(tǒng)調(diào)用是如何完成重定向這個(gè)艱巨的任務(wù)的呢?我們不妨先看個(gè)例子。
   
當(dāng)我們?cè)趕hell下輸入如下命令:“echo
hello!”,這條命令要求shell進(jìn)程執(zhí)行一個(gè)可執(zhí)行文件echo,參數(shù)為“hello!”。當(dāng)shell接收到命令之后,先找到
bin/echo,然后fork()出一個(gè)子進(jìn)程讓他執(zhí)行bin/echo,并將參數(shù)傳遞給它,而這個(gè)進(jìn)程從shell繼承了三個(gè)標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入
(stdin),標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)出錯(cuò)信息(stderr),他們?nèi)齻(gè)的文件號(hào)分別為0、1、2。而至于echo進(jìn)程的工作很簡(jiǎn)單,就是將
參數(shù)“hello!”寫(xiě)道標(biāo)準(zhǔn)輸出文件中去,通常都是我們的顯示器上。但是如果我們將命令改成“echo hello! >
foo”,則在執(zhí)行時(shí)輸出將會(huì)被重定向到磁盤(pán)文件foo中。我們假定在此之前該shell進(jìn)程只有三個(gè)標(biāo)準(zhǔn)文件打開(kāi),文件號(hào)分別為0、1、2,以上命令行
將按如下序列執(zhí)行:
    (1) 打開(kāi)或創(chuàng)建磁盤(pán)文件foo,如果foo中原來(lái)有內(nèi)容,則清除原來(lái)內(nèi)容,其文件號(hào)為3。
    (2) 通過(guò)dup()復(fù)制文件stdout,即將文件號(hào)1出的file結(jié)構(gòu)指針復(fù)制到文件號(hào)4處,目的是將stdout的file指針暫時(shí)保存一下
    (3) 關(guān)閉stdout,即1號(hào)文件,但是由于4號(hào)文件對(duì)stdout也同時(shí)有個(gè)引用,所以stdout文件并未真正關(guān)閉,只是騰出1號(hào)文件號(hào)位置。
    (4) 通過(guò)dup(),復(fù)制3號(hào)文件(即磁盤(pán)文件foo),由于1號(hào)文件關(guān)閉,其位置空缺,故3號(hào)文件被復(fù)制到1號(hào),即進(jìn)程中原來(lái)指向stdout的指針指向了foo。
   
(5)
通過(guò)系統(tǒng)調(diào)用fork()和exec()創(chuàng)建子進(jìn)程并執(zhí)行echo,子進(jìn)程在執(zhí)行echo前夕關(guān)閉3號(hào)和4號(hào)文件,只留下0、1、2三個(gè)文件,請(qǐng)注意,這
時(shí)的1號(hào)文件已經(jīng)不是stdout而是磁盤(pán)文件foo了。當(dāng)echo想向stdout文件寫(xiě)入“hello!”時(shí)自然就寫(xiě)入到了foo中。
    (6) 回到shell后,關(guān)閉指向foo的1號(hào)與3號(hào)文件文件,再用dup()和close()將2號(hào)恢復(fù)至stdout,這樣shell就恢復(fù)了0、1、2三個(gè)標(biāo)準(zhǔn)輸入/輸出文件。
   
由此可見(jiàn),當(dāng)echo程序(或其他)在運(yùn)行的時(shí)候并不知道stdout(對(duì)于stdin和stderr同樣)指向什么,進(jìn)程與實(shí)際輸出文件或設(shè)備的結(jié)合是
在運(yùn)行時(shí)由其父進(jìn)程“包辦”的。這樣就簡(jiǎn)化了子進(jìn)程的程序設(shè)計(jì),因?yàn)樵谠O(shè)計(jì)時(shí)只要跟三個(gè)邏輯上存在的文件打交道就可以了。可能有人會(huì)覺(jué)得這很像面向?qū)ο笾?br /> 的多態(tài)和重載,沒(méi)有什么新奇之處,但是如果你活在30甚至40年前,可能你會(huì)改變你的看法。
               
               
               

本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/21422/showart_388932.html
您需要登錄后才可以回帖 登錄 | 注冊(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)專區(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