2013-08-29 15 views
7

Chciałbym poznać prawidłowe wartości, jakich mogę się spodziewać dla deskryptora pliku.Jakie są możliwe wartości deskryptorów plików?

Proszę pozwolić mi trochę wyjaśnić. Wiem, że, na przykład, kiedy używać #include <unistd.h> w moim systemie linux następnie wezwanie do otwarcia pliku do odczytu: może wystąpić

int fileDescriptor; 
fileDescriptor = open("/some/filename",O_RDONLY); 

błąd i otrzymuję -1 wyniku.
Nawiasem mówiąc, (-1) negatywny musi mieć nieco szczególne znaczenie. Czy wszystkie pozostałe wartości są poprawnymi deskryptorami plików? tj. również negatywne, takie jak -2 i -1023?

Zakładając, że int jest 4 bajty (sizeof(int)==4), wtedy

(-1) = 10000000 0000000 00000000 00000001 

byłaby jedyną wykrywalnego nieprawidłowy deskryptor pliku? byłoby inni lubią:

  • (0) = 00000000 0000000 00000000 00000000
  • (-2) = 10000000 0000000 00000000 00000010
  • (2) = 00000000 0000000 00000000 00000010

być ok? Ponieważ deskryptor pliku mógł przechowywać 4 bajty, mógłbym mieć maksymalnie (2^(8 * 4) -1) poprawne deskryptory plików, a co za tym idzie maksymalna liczba plików, które mogę otworzyć, prawda?

Mówiąc zwykły ponownie:

Co należy spodziewać się (ważne) deskryptor być?

dowolna wartość oprócz -1?

+0

"deskryptor pliku, mała, ** nieujemna liczba całkowita ** do wykorzystania w kolejnych wywołaniach systemowych" patrz man 2 open –

+0

Zobacz [to pytanie] (https://stackoverflow.com/questions/17931583/maximum-number- z-files-that-can-be-opened-by-c-fopen-in-linux) dla maksymalnej liczby plików/deskryptorów plików, które można otworzyć. – jotik

Odpowiedz

12

Z man page:

open() zwraca deskryptor pliku, mały, nieujemną liczbą całkowitą.

, a następnie:

open() i creat() zwrócić nową deskryptor, lub -1, jeśli wystąpił błąd

+0

Proponuję wyjaśnić, że "mały" oznacza mniej niż RLIMIT_NOFILE (jeśli tak jest zawsze). – Praxeolitic

1

Oto co Linux manual page mówi:

open() i creat() zwracają nowy deskryptor pliku, lub -1 jeśli (w tym przypadku, errno jest odpowiednio ustawione) wystąpił błąd.

Inne systemy mogą zwracać inne wartości ujemne w przypadku błędu.

2

open Gdy zawodzą, to zwraca -1 lub 0xffffffff. To nie ma znaczenia, ale open failed:

Po pomyślnym zakończeniu, funkcja otwiera plik i zwraca nieujemną liczbę całkowitą reprezentującą najniższym numerze nieużywany deskryptor pliku. W przeciwnym razie zwracane jest -1, a errno ustawione na wskazują na błąd. Żadne pliki nie powinny być tworzone lub modyfikowane, jeśli funkcja zwraca -1.

Powodem awarii jest przechowywany w errno można odczytać jej wartość i sprawdzić, czy jest to jeden z możliwych powodów niepowodzeń EACCES, EEXIST, EINTR .. etc, lub po prostu użyć perror wydrukować komunikat o błędzie.

1

Zakres możliwych wartości deskryptorów plików wynosi od 0 do 1023 dla systemu Linux (system 32-bitowy lub 64-bitowy).

Nie można utworzyć deskryptora pliku o wartości większej niż 1023. W przypadku deskryptora pliku o wartości 1024 zwróci on błąd EBADF (niepoprawny deskryptor pliku, błąd nr 9).

Po zwróceniu wartości ujemnej deskryptora pliku oznacza, że ​​wystąpił błąd.

+4

Należy pamiętać, że 1024 to zwyczajowa wartość domyślna dla RLIMIT_NOFILE (ulimit -n). Jeśli to zwiększysz, będzie obsługiwał ponad 1024 pliki na proces. (Również istotne jest ograniczenie całego pliku, w przeciwieństwie do per-process, deskryptora pliku - jest to kontrolowane przez pokrętło sysctl fs.file-max) –

Powiązane problemy