2014-11-15 57 views
2

這是我在開發我的課程項目時發現的。下面是C代碼塊,用於打印出尚未連接到任何進程的空管的信息。硬鏈接到空管道的數量linux vs unix

{ 
int pfd[2], nread; 
char s[100]; 
struct stat pipe_info; 
if (pipe(pfd) == -1) 
{ 
    perror ("pipe"); 
    return (-1); 
} 

if (fstat (pfd[0], &pipe_info) < 0) 
    perror ("fstat"); 

print_info (&pipe_info); 

if (fstat (pfd[1], &pipe_info) < 0) 
    perror ("fstat"); 

print_info (&pipe_info); 

return(0); 
} 

void print_info (struct stat *pipe_info) 
{ 
    printf ("mode %o\n", pipe_info->st_mode); 
    printf ("inode %d\n", pipe_info->st_ino); 
    printf ("device %d\n", pipe_info->st_dev); 
    printf ("minor device %d\n", pipe_info->st_rdev); 
    printf ("num links %d\n", pipe_info->st_nlink); 
    printf ("uid %d\n", pipe_info->st_uid); 
    printf ("gid %d\n", pipe_info->st_gid); 
    printf ("size %d\n", pipe_info->st_size); 
    printf ("atime %d\n", pipe_info->st_atime); 
    printf ("mtime %d\n", pipe_info->st_mtime); 
    printf ("ctime %d\n", pipe_info->st_ctime); 
    printf ("block size %d\n", pipe_info->st_blksize); 
    printf ("block %d\n", pipe_info->st_blocks); 
} 

我在Linux機器和Solaris OS機器上編譯了源代碼。我發現在Linux機器上,鏈接數爲1,而在Solaris OS機器上,管道的鏈接數爲0.我對兩個系統的內核都很陌生,想知道爲什麼兩個系統上的鏈接數量是不同的?

回答

3

SunOS 5.10/Solaris 2.x manual說,這對st_nlink領域:

st_nlink此字段只應由行政命令一起使用。

我讀爲「這個領域有一個無意義的價值」。

與此相反,Linux的價值是有道理的:管道鏈接到創建它的進程。我預計st_nlink將等於2,一旦對方被連接到(分叉)的過程。 Linux fstat聲稱POSIX符合性很好。 Solaris手冊頁我沒有提出這樣的說法。

如果你的潛在的問題是我怎麼能告訴我們,如果一個管道的月球背面連接,有兩個答案:

  1. 你的程序應該知道,如果它附着在月球背面
  2. 你可以試着寫管道並獲得EAGAIN,EWOULDBLOCK,EPIPE或SIGPIPE信號的某種組合。

如果管道的另一端已連接,則選項2會出現問題。如果您可以創建一條永遠不會被作者發送的消息而被讀者拒絕,那麼您可以解決它。

+0

謝謝,你的文章很有幫助,但我不確定你的陳述的正確性 - 「這個領域有一個無意義的價值」。 –

+0

好的,將我的解釋替換爲「除非您有權訪問源代碼,否則nlink的語義對您無意義。」我沒有資源,大概也不是你的,因爲Solaris是專有軟件。通過你自己的經驗測試,Solaris產生了一個不合格的結果,我們都不能猜測爲什麼。如果我有一臺Solaris機器可用,那麼有很多簡單的測試可以解釋Solaris下nlink的含義。這就是在過去的糟糕時代,有30種不同的核心,除了歷史之外,沒有任何理由,它們都略有不同。 – msw