2009-08-10 7 views
5

Na dość wysokim poziomie w funkcji Linux write(), odfiltrowuje żądania dotyczące zapisu buforów długości 0. To ma sens. Kto by chciał, żeby system operacyjny marnował czas na przeglądanie warstw tylko po to, by stwierdzić, że nie ma pracy do zrobienia?Jakie są konsekwencje wywołania metody write() o zerowej długości?

Cóż ... mnie.

Jest to związane z tym question; oraz odkrycie, że bitowy sterownik I2C da potencjalnie przydatny kod powrotu, jeśli adres (wysłany na magistrali przed danymi) spowoduje błąd, jeśli uzgadnianie jest niepoprawne.

Jeden może wysłać dane fikcyjne po adresie, ale nie z urządzeniem używam. (Może spróbuję przeczytać ...).

Pytanie brzmi: Jaki rodzaj piekła zostałby uwolniony, gdyby jądro pozwalało na zapisywanie długości na zero (0)?

Odpowiedz

2

Właśnie ze względu na zamknięcie, idę z pomysłem Warren Young na aktualizację sterownika i opublikowanie łatki (kiedy dostanę okrągłą tuit).

+0

A to pomoże nam w końcu. Dziękuję Ci –

0

nie poważną odpowiedź: można dostać taki program jak touch: P

1

Bardzo niewiele, to myślę - może to być możliwe, że zapis o zerowej długości będzie blokować jeśli bufor to pisemnie do w niektórych sterownikach ma również zerową dostępną przestrzeń. Niedozwolone pisanie o zerowej długości może w takich przypadkach uprościć sytuację, a także uniknąć wielu marnowania pracy.

Dlaczego po prostu nie usunąć tej kontroli i zobaczyć, co się tak naprawdę piekło rozpada? :)

5

Co ty opisujesz wynosi zasadniczo ten sam rodzaj zła, które atakuje kilka interfejsów API systemu Windows, które wymagają nieprzewidywalne ilości pamięci. Praktyką jest wywoływanie ich bez bufora, w którym umieszcza się ich prace, i tak wykonują pracę, nie przechowując wyników, ale licząc liczbę bajtów, których potrzebowaliby po drodze. Następnie należy przydzielić bufor o tym rozmiarze i ponownie wywołać funkcję z buforem, znając rozmiar.

To nieopisanie zło. Jest to programowanie komputerowe odpowiadające zepsutej biurokracji, gdzie każdy wydział wymaga wypełnienia formularza, który zawiera większość tych samych informacji, co w poprzednim dziale, ale ponieważ istnieją różne informacje na temat każdego formularza, oni nie tylko wezmą kopię formularza, który daliście innym facetom. Ptui!

Czas programisty jest drogi, czas procesora jest tani. Wymaganie od programistów napisania tego samego wywołania API N razy, aby wydedukować jakiś światowy stan, który sam interfejs API mógłby sam rozwiązać, próbuje to zepsuć.

Najlepszą praktyką jest więc mieć kierowca zrobić wszystko, aby upewnić się, że write() się powiedzie. Jeśli można przewidzieć z góry, że nie uda się sprawdzić stanu na świecie, może to być ioctl().

+0

+1 obejście sprzętu należy do jądra ... ale jeśli tak nie jest, a jest to bardzo stare (nieobsługiwane) jądro, rozsądne może być obejście w przestrzeni użytkownika. – bdonlan

+0

Ale w tym przypadku tak naprawdę nie chcę pisać - więc analogia Windows nie ma zastosowania. Zasadniczo chcę "zapisać" zero bajtów. W przeciwnym razie zmieniam API, dodając zastrzeżone wywołania ioctl do ustalonego sterownika. – Jamie

+3

Nie sądzę, że powinieneś * dodać * zastrzeżenie do sterownika. Myślę, że powinieneś wskazać to zachowanie osobie, która utrzymuje ten sterownik, i poprosić o - lub dostarczyć im łatkę - ujawniając tę ​​funkcjonalność. Można go nazwać funkcją I2C_PING. ioctls() są jednym ze sposobów, aby to zrobić./proc i sysctl to inne. –

0

boję się sugerować ioctl(), ale nie byłoby to lepszy interfejs do uzyskiwania informacji o stanie o interfejsie?

0

Co oznacza napis o zerowej długości? Ogólnie rzecz biorąc, zapis oznacza transfer danych ... i jestem pewien, że więcej problemów byłoby spowodowanych przez nieodczytanie go, a przez to złapanie większości złych danych wejściowych dla kierowców.y

jeśli jest to jednorazowe połączenie "zrób to", o które prosisz, myślę, że ioctl jest drogą do zrobienia. Nie jest ładna, ale co możesz zrobić?

Alternatywnie, weź opcję jądrową, użyj mmap() i przenieś całą rzecz do przestrzeni użytkownika. Niskie koszty i możesz napisać klasyczny kod poke, np. "Napisz X do tego rejestru", który prawie wydaje się być tym, czego potrzebujesz.