Portál AbcLinuxu, 5. května 2025 13:01
Řešení dotazu:
Měl bych jeden příkládek, jak jsem to páchával já. Omlouvám se za nevysokou štábní kulturu, je to jenom pár rychlých hacků. Je tam pár funkcí pro nastavení baudu, formátu znaku apod. prostě inicializaci sériového portu skrz termios. A C++ je tam jenom pro primitivní opouzdření - vlastně se jedná o skoro čisté Céčko.
Pokud se správně pamatuju, stačilo otevřít device pro čtení i zápis (podrobné flagy viz zdroják), pokonfigurovat baud rate a trochu umravnit TTY halucinace aby se device choval jako tupé znakové zařízení, a pak šlo ten port obsluhovat dvěma různými vlákny, z nichž jedno většinu času spalo zablokované v read() a druhé občas poslalo nějaký write(). Obě vlákna sdílejí otevřený file descriptor.
Troufl bych si nesouhlasit s názorem, že blokující synchronní I/O je out. Minimálně pokud se sériových portů týče. Rozvlákněním s důslednou aplikací primitivních principů producent/konzument a "pouze na jednom místě se smíš na neurčito zablokovat" se dají napsat docela zajímavé věci (nemluvím o výše odkázaném rychlém bastlu). Je na tom nějaká práce se vzájemnou synchronizací threadů a člověk se nesmí bát trochu "vykouknout ze škatulky" klasických POSIXových synchronizačních primitiv: já jsem si prošel učebnicové příklady a pak jsem si z nich skládal trochu složitější objekty pro "vzájemné vyloučení" a komunikaci více vláken podle potřeb konkrétní aplikace.
Pravda je, že asynchronní IO s použitím callbacků vyřeší spoustu věcí asi napohled méně pracně - mně to přišlo trochu nepřehledné a v některých případech se mi moc nelíbilo, že pak aplikace dělá "příliš mnoho různých věcí v jednom vlákně", tzn. při nepečlivém programování hrozí situace, kdy se nějaký callback "nečekaně" zablokuje a zdržuje ostatní callbacky. Záleží na osobních preferencích, cílech, situaci, programátorské sebekázni...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.