( locsemege | 2012. 04. 15., v – 19:45 )

É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