Mam urządzenie, które wysyła informacje przez USB do mojego komputera. Arch Linux konfiguruje to urządzenie, tworząc plik o nazwie ttyUSB0
w /dev/
. Używałem GTKterm
do odbierania tych przychodzących informacji i wyświetlania ich w emulowanym oknie terminala.
Moje pytanie brzmi: jak dokładnie GTKterm
odczytuje / zapisuje ten ttyUSB0
plik i gdzie mogę zacząć uczyć się, jak wdrażać podobną funkcjonalność? To znaczy, w najbardziej podstawowej formie, w jaki sposób mogę napisać znak ttyUSB0
lub, przeciwnie, otrzymać bajt i zapisać go do pliku?
screen
może to zrobić, iminiterm
screen
i / lubminiterm
programować.Odpowiedzi:
Pliki TTY to pliki, których można używać tak samo jak każdego innego. Możesz je otworzyć za pomocą standardowych narzędzi do otwierania plików w swoim języku i czytać lub pisać z nich. Mają pewne specjalne zachowanie, które różni się od „zwykłych” plików, ale podstawy są takie same. Na końcu omówię kilka specjalnych przypadków, ale najpierw eksperyment.
Jedną interesującą rzecz, którą możesz zrobić bezpośrednio ze zwykłego terminala. Uruchom,
tty
a wyświetli wiersz:To urządzenie TTY, na którym działa terminal. Możesz coś napisać na tym terminalu:
Możesz nawet przeczytać z niego:
(
read X
to polecenie sh „odczytuje wiersz ze standardowego wejścia do zmiennej X”; <ma używać / dev / pts / 2 jako standardowego wejścia dla polecenia read; pierwsze „hello” wpisałem, a drugie zostało wydrukowane) .Jeśli otworzysz inną powłokę, powiedzmy za pomocą
screen
lubxterm
, możesz uruchomićecho spooky > /dev/pts/2
w tej powłoce, aby tekst pojawił się na oryginalnym terminalu, i to samo dla innych poleceń. Wszystko to jest tylko twoją powłoką otwierającą plik bez wiedzy, że jest to TTY.Oto bardzo prosty program C, który robi dokładnie to, o co prosiłeś, i zapisuje pojedynczy znak do / dev / pts / 3, a następnie odczytuje z niego pojedynczy bajt:
Prawdziwe urządzenie TTY, które jest podłączone do emulatora powłoki lub terminala, będzie miało tam ciekawe zachowanie, ale powinieneś coś odzyskać.
Aby uzyskać dostęp do terminala, musisz mieć pozwolenie na jego użycie. Są to tylko standardowe uprawnienia do plików, które widzisz
ls -l
i ustawiasz za pomocąchmod
: musisz mieć uprawnienia do odczytu, aby otworzyć plik i odczytać, oraz uprawnienia do zapisu, aby do niego zapisać. TTY, które wspierają terminal, będą własnością użytkownika, ale TTY innego użytkownika nie, a TTY na urządzenia USB mogą, ale nie muszą, w zależności od konfiguracji. Możesz zmienić uprawnienia w taki sam sposób, jak zawsze.Jeśli chodzi o pisanie programu do pracy z nim, nie musisz robić nic specjalnego. W tym przykładzie widać, że jedną rzeczą, której nie trzeba robić, jest zamykanie pliku za każdym razem, aby dane były odczytywane przez drugi koniec: pliki TTY działają jak potoki, popychając dane w obu kierunkach, gdy tylko nadchodzą. Kiedy napisałem tekst do TTY, pojawił się natychmiast, a kiedy go przeczytałem, nic już na mnie nie czekało. To nie jest jak zapisywanie do zwykłego pliku, w którym dane są zapisywane na dysku - są one natychmiast przekazywane na drugą stronę lub przechowywane w pamięci, dopóki ktoś ich nie przeczyta.
Możesz użyć funkcji wyboru , abyś mógł robić inne rzeczy, czekając, aż urządzenie coś powie, ale jeśli z przyjemnością zaczekasz na dane, możesz po prostu zablokować odczyty i pozwolić systemowi operacyjnemu zrobić podnoszenie.
Jedną z rzeczy, o których należy pamiętać, jest to, że w jądrze może być ograniczony rozmiar bufora, a jeśli napiszesz dużo danych naraz, możesz zablokować się bez sensu. Jeśli może to stanowić problem, użyj nieblokującego We / Wy z
open("/dev/...", O_RDWR | O_NONBLOCK)
. W obu przypadkach zasada będzie taka sama.źródło
sudo echo Hello > /dev/tty4
gdy jestem w środowisku pulpitu, ale dostaję,bash: /dev/tty4: Permission denied
jeśli nie jestem zalogowany do tty4. Jednak jeśli jestem zalogowany do tty4, wszystko działa dobrze. Jaki jest tego powód?ls -l /dev/tty4
> /dev/tty4
część ist nie częściąecho
podproces rozpoczętej przezsudo
ale częśćsudo
samego procesu, który jest wykonywany przez bieżącego użytkownika. zamiast roota mają zastosowanie uprawnienia do pliku dla bieżącego użytkownika.