2014-12-07 49 views
0

有人可以向我解釋I/O嗎?從我收集的所有東西中,可以抽象地總結出計算機與人類交互的方式,反之亦然。 I/O通道或「如何」可以根據外部設備和/或內部操作系統管理來運行色域。IO.sysopen返回什麼?

那麼Ruby中的IO類是做什麼的?它與Java或C有什麼不同?

而且就拿這個代碼:

x = IO.sysopen("file_name") 
p x 

回報是基於文件描述符一個Fixnum。在這種情況下,「file_name」是一個pdf文件並返回一個7.返回對象是什麼意思?

回答

1

首先,sysopen是與系統交互的非常低級別的方式。對於Ruby中的正常輸入和輸出,您應該使用File.open

sysopen返回的數字稱爲「文件描述符」。它本質上是一個數組的索引,但不是一個Ruby數組;它存在於由操作系統維護的進程內存中。第一個文件描述符,編號爲0,被稱爲「標準輸入」。輸入調用默認會從這個輸入流中讀取。第二,1,被稱爲「標準輸出」;輸出調用在默認情況下發送它們的輸出。第三,2,被稱爲「標準錯誤」,這是錯誤信息的去處。在Ruby甚至開始之前,所有這三個操作系統都被操作系統打開。通常他們都綁在終端上,但是你可以通過shell重定向來改變它。

作爲一般規則,當您打開一個額外的文件時,您打開的第一個文件將獲得文件描述符3,接下來的4個,依此類推。所以,如果你得到7回,那就意味着在它到達你的代碼時,Ruby已經打開了4個其他文件。這就是全部意思。根據數字你不能告訴任何有關打開文件的事情。你必須把這個數字交給一個系統調用,它可以查看文件描述符數組來查看發生了什麼。

但是在Ruby中,您通常沒有理由知道或關心文件描述符編號。您處理IO類(及其子類,如特定類型的I/O的File)的實例。您可以調用IO對象上的方法,併爲您處理系統調用的詳細信息。由預定義常數STDIN(也是全局變量$stdin的初始值)引用的對象知道其文件描述符爲0,因此您不必知道該對象。

+0

不錯的答案。是的,很少有理由低於「開放」水平。這通常被認爲是Ruby和其他腳本語言的主要優勢。 – 2014-12-07 07:08:24