иногда зависает open() (chat -S -r /tmp/report -t 5 -f script > /dev/ttyS2 < /dev/ttyS2)

Модератор: Модераторы разделов

Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

иногда зависает open()

Сообщение DimkaS »

Есть скрипт, который среди прочего использует chat следующим образом:

Код: Выделить всё

chat -S  -r /tmp/report -t 5 -f script > /dev/ttyS2 < /dev/ttyS2

Иногда скрипт зависает. chat в списке процессов не виден, команда перед ним выполнена, за ним - нет.
strace говорит следующее:

Код: Выделить всё

open("/dev/ttyS2", O_WRONLY|O_CREAT|O_TRUNC, 0666

Если открыть зависший порт через picocom, то после закрытия терминала всё "отвисает" и strace показывает результат:

Код: Выделить всё

open("/dev/ttyS2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EAGAIN (Resource temporarily unavailable)

Сам picocom открывает порт так:

Код: Выделить всё

open("/dev/ttyS2", O_RDWR|O_NONBLOCK)   = 3

Как я понимаю, зависает оболочка при попытке открыть ttyS2 чтобы перенаправить вывод chat.
Не понятно, почему open() не возвращает EAGAIN сразу и почему picocom открывает файл без проблем.
Что может мешать открытию ttyS2 и что можно сделать не переписывая chat?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: иногда зависает open()

Сообщение Portnov »

DimkaS писал(а):
21.05.2009 17:52
почему open() не возвращает EAGAIN сразу и почему picocom открывает файл без проблем.

Ибо в оболочке
O_WRONLY|O_CREAT|O_TRUNC

а в picocom
O_RDWR|O_NONBLOCK

Ключевое слово O_NONBLOCK.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: иногда зависает open()

Сообщение DimkaS »

Да, логично. Непонятно, почему порт недоступен - других процессов, которые могли бы его использовать в ps не видно.

+++ 21.05
Ресурс занят - процесс блокируется. Это понятно. Непонятно почему после освобождения ресурса процесс получает EAGAIN?
Логично вернуть EAGAIN сразу, если ресурс занят. Логично заблокировать процесс до освобождения ресурса и вернуть дескриптор после освобождения. Но вернуть EAGAIN когда ресурс освободился - это странно, на мой взгляд.

Вчера у меня проскакивало сообщение о том, что количество захватов и освобождений порта не совпадает. Не помню, как оно в оригинале выглядело. Сегодня добиться такого не удалось.

+++ 22.05
В выводе lsof /dev/ttyS2 не упоминается, а скрипт всё равно висит. Чудеса.
Спасибо сказали: