• Непонятки с read и write

    From Denis Sovkov@2:5020/570.77 to All on Wed Nov 29 22:08:04 2023
    * Forwarded from ru.unix by Denis Sovkov (2:5020/570.77).
    * Originally by: Denis Sovkov (2:5020/570.77), 29 Nov 23 22:02.
    * Originally to: all.


    Hello everybody!


    Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0 с флагом O_RDWR - можно как записывать, так и читать. В программе два параллельных потока - один раз в 3 секунды записывать текстовыю строку в открытый дескриптор, другой считывает оттуда присланную строку ПОБАЙТО внешним устройством тогда, когда сможет и выводит на экран. Проблема в том, что во входные данные попадает часть того, что пишется в дескриптор, причем независимо от времени. Пробовал защищать дескриптор мютексом - не помогло, мусорные данные все равно попадают на вход (кстати, нужные данные при этом тоже считываются). Пробовал ставить флаг O_DSYNC - тоже не помогло. Мозможно, нужно очищать буфер (какой и как?) сразу после отправки строки. В потоках буферы используются разные - для каждого потока свой. Имею ввиду очистку выходного буфера, который пишет write. ЧЯДТ? Куда копать?


    Denis


    --- GoldED+/LNX 1.1.5-b20180707
    * Origin: ----> Default GoldED Origin <---- (2:5020/570.77)
  • From Nil A@2:5015/46 to Denis Sovkov on Wed Nov 29 22:23:44 2023
    Hello, Denis!

    Wednesday November 29 2023 22:08, from Denis Sovkov -> All:

    Ситауция следующая: имеем программу, программа открывает /dev/ttyUSB0
    с флагом O_RDWR - можно как записывать, так и читать. В программе два параллельных потока - один раз в 3 секунды записывать текстовыю строку
    в открытый дескриптор, другой считывает оттуда присланную строку
    ПОБАЙТО внешним устройством тогда, когда сможет и выводит на экран. Проблема в том, что во входные данные попадает часть того, что пишется
    в дескриптор, причем независимо от времени.

    Возможно, там где-то написано, что операции с сериальным /dev/ttyUSB не thread-safe.
    А что тебе мешает в потоке номер 1 просто сделать slect()/poll()/epoll() на выбор и пиши/читай, и делай после этого что тебе надо.

    Best Regards, Nil
    --- GoldED+/LNX 1.1.5
    * Origin: Linux 2.6.32-042stab145.3 (2:5015/46)
  • From Denis Sovkov@2:5020/570.77 to Nil A on Wed Nov 29 22:44:14 2023

    Hello Nil!

    29 Nov 23 22:23, you wrote to me:

    входные данные попадает часть того, что пишется в дескриптор,
    причем независимо от времени.

    Возможно, там где-то написано, что операции с сериальным /dev/ttyUSB
    не thread-safe. А что тебе мешает в потоке номер 1 просто сделать slect()/poll()/epoll() на выбор и пиши/читай, и делай после этого что
    тебе надо.

    Мешает отсутствие должной полноты знаний по IO в *NIX. Посмотрел маны на указанные вызовы - любопытно, спасибо! Буду копать в эту сторону. Завтра я не на работе, так что проверить смогу только послезавтра наверное... Будет время по RTFMмить ))

    Denis


    --- GoldED+/LNX 1.1.5-b20180707
    * Origin: ----> Default GoldED Origin <---- (2:5020/570.77)
  • From Nil A@2:5015/46 to Denis Sovkov on Wed Nov 29 23:15:18 2023
    Hello, Denis!

    Wednesday November 29 2023 22:44, from Denis Sovkov -> Nil A:

    Возможно, там где-то написано, что операции с сериальным
    /dev/ttyUSB не thread-safe. А что тебе мешает в потоке номер 1
    просто сделать slect()/poll()/epoll() на выбор и пиши/читай, и
    делай после этого что тебе надо.

    Мешает отсутствие должной полноты знаний по IO в *NIX. Посмотрел маны
    на указанные вызовы - любопытно, спасибо! Буду копать в эту сторону. Завтра я не на работе, так что проверить смогу только послезавтра наверное... Будет время по RTFMмить ))

    Там где должно быть написано, скорее всего даже что не thread-safe а как-то, типа один только дескриптор на /dev/ttyUSB, а иначе UB.

    Дык, юниксы, они такие, там треды завезли только сильно после форков. А так весь IO обрабатывает я на select() (до 1024 дескрипторов, но и даже сегодня так уже писать не надо), либо современный epoll().

    Best Regards, Nil
    --- GoldED+/LNX 1.1.5
    * Origin: Linux 2.6.32-042stab145.3 (2:5015/46)
  • From Denis Sovkov@2:5020/570.77 to Nil A on Thu Nov 30 14:43:42 2023

    Hello Nil!

    29 Nov 23 23:15, you wrote to me:

    Дык, юниксы, они такие, там треды завезли только сильно после форков.

    у вот и у меня как раз pthread's ))

    Denis


    --- GoldED+/LNX 1.1.5-b20180707
    * Origin: ----> Default GoldED Origin <---- (2:5020/570.77)