Éppen elkezdeném csinálni, erre máris elakadtam. Egy példában látom az alábbit:
#define EINTR_RETRY(expression) \
({ \
long int _result; \
do _result = (long int) (expression); \
while (_result == -1L && errno == EINTR); \
_result; \
})
int
open_port (char *port_name)
{
int fd;
fd = EINTR_RETRY (open (port_name, O_RDWR | O_NOCTTY | O_NONBLOCK));
if (fd == -1)
{
perror ("open_port: Unable to open port");
}
else
fcntl (fd, F_SETFL, 0);
return (fd);
}
Azt tegyük félre, hogy abban a #define-ban talán a SIGINT-et kezelnék, s nem értem, de ez most nem is annyira fontos. Ugyanakkor az miért van, hogy megnyitja a portot - pl. /dev/ttyS0 - nonblock módban, majd ha sikerült, akkor blokkolóssá változtatja a beállítást? Nem lenne egyszerűbb az O_NONBLOCK flag elhagyása? Ha úgysem sikerül a megnyitás, akkor nem mindegy? Ha meg sikerül, akkor meg úgyis blokkolós kell, nem? Vagy itt valami egészen másról van szó?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE