2012-11-21 276 views
0

我想創建阻塞和無阻塞Unix的C.第一個文件,阻止:如何在unix中創建阻塞文件描述符?

fd = open("file.txt", O_CREAT | O_WRONLY | O_EXCL); 

是這樣嗎?我是否應該添加一些模式選項,例如0666?

非阻塞文件如何?我不知道這一點。

我想實現這樣的:

    當我打開它在它寫的,它是開放的寫作,它的確定
  1. ;如果沒有,它會阻止。
  2. 當我打開它來閱讀它,它打開閱讀,沒關係;如果沒有,它會阻止。
+2

你是什麼意思下的「阻塞」文件? – LiMar

+0

「阻止」,你的意思是沒有其他應用程序應該能夠訪問該文件? –

+0

@LiMar:我不是很確定如何解釋這一點:我的意思是,它的默認文件「模式」在Linux – mazix

回答

2

文件描述符阻塞或非阻塞;文件不是。如果需要非阻塞文件描述符,請將O_NBLOCK添加到open()調用中的選項中。

注意,在打開一個FIFO讀或寫會阻塞,除非有與FIFO開放其他操作的過程中,或您指定O_NBLOCK。如果打開它進行讀取和寫入,open()是非阻塞的(將立即返回); I/O操作仍由您是否設置O_NBLOCK來控制。

更新的問題並不清楚。但是,如果您正在尋找「獨佔文件訪問權限」(因此沒有其他人打開它),那麼O_EXCL和O_NBLOCK都不是答案。 O_EXCL影響創建文件時發生的情況;如果文件已經存在,創建將失敗。 O_NBLOCK影響當沒有可讀取的數據時read()操作是否會被阻塞。如果您閱讀了POSIX open()描述,那麼您可以請求對文件進行「獨佔訪問」。

回答有關文件模式的問題:如果你有O_CREAT,則需要第三個參數open()。如果省略O_CREAT,則不需要open()的第三個參數。這是一個可變參數功能:

int open(const char *filename, int options, ...); 
1

不應該添加一些模式選項嗎?

如果該文件是隻寫的,並且如果不存在則創建。在這種情況下,open()也需要第三個參數,因此省略它會導致未定義的行爲。

編輯:

更新的問題更是混亂...

當我打開它,在它寫的,它打開了寫作,它的確定

;如果沒有,它會阻止。

爲什麼你需要那個?請參閱如果您嘗試寫入未打開的文件/文件描述符,write()將返回-1,您可以檢查存儲在errno中的錯誤代碼。告訴我們你想通過這個你想要的奇異事物來達到什麼目的,而不是讓你的代碼過分複雜化。

(備註括號:

我想創建阻塞和非阻塞文件

那是什麼

在UNIX公司的C

?再次,沒有這樣的事情,有the C語言,這是平臺無關的。)

+0

感謝您的解釋。你可以如此善良,看到我的編輯,並說如果這樣可能嗎? – mazix

1

我不知道你在調用一個阻塞文件(在Unix中阻塞IO意味着IO操作等待數據可用或確定失敗,他們反對非阻塞IO,如果沒有可用數據,則立即返回)。

  • 當您使用O_CREAT打開時,您總是需要指定一個模式。

  • 開放你展將失敗,如果該文件已經存在(當固定上述點)。

  • Unix沒有標準的方式來鎖定文件以進行獨佔訪問,例外。有諮詢鎖(但所有程序都必須遵守協議)。一些有強制鎖定擴展。在接入網絡文件系統時,接收到的智慧並不是要依靠任何一種鎖定。