Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
3 / 3 / 0
Регистрация: 18.03.2009
Сообщений: 20

read()/write() блокировки

01.04.2011, 01:37. Показов 6397. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Проблема следующая - системные вызовы read()/write() блокируются если читают/пишут больше, чем надо в pipe.
Можно ли каким-то образом отловить данный факт?
Испробовал wait, waitpid, ptrace, fcntl. Толи что-то не то делал, то ли они все же не подходят.

Приложение типа родитель-потомок.

Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.04.2011, 01:37
Ответы с готовыми решениями:

read/write thread safety
есть 2 потока, один пишет(write), другой читает(read). thread safety или нет? P.S если имеет значение, то речь идет о модеме.

С помощью read и write записать массив структур в файл
Не могу с помощью системных вызовов read write записать массив структур в файл. Именно read write. Если такое вообще возможно.

Отправка сообщений между дочерними и родительским процессами (fork,pipe,write,read)
Здравствуйте, помогите реализовать отправку сообщений по следующей схеме: Попытался самостоятельно реализовать первую схему, вот что...

10
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.04.2011, 01:41
Цитата Сообщение от XaosLord Посмотреть сообщение
Можно ли каким-то образом отловить данный факт?
каким образом? и что за факт?
0
3 / 3 / 0
Регистрация: 18.03.2009
Сообщений: 20
01.04.2011, 02:49  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
каким образом? и что за факт?
Расширю мысль:
Каким образом возможно из родительского процесса отловить факт блокировки дочернего процесса при использовании дочерним процессом вызовов read или write.

Пример (набросок)

C++
1
2
3
4
5
6
7
8
9
10
int F[2];
pipe(F);
Int pid = fork();
If(pid == 0)
{
char buff[70000];
write(F[1], buff, 70000); //все, заблочились, т.к. в пайп лезет всего 65536
printf("..."); //эта строка никогда не выполнится
...
} else { //родитель чтото делает
Так вот. Как родителю обнаружить, что дитя заблочилось?
И как бы его разблочить... Разблочить можно прочитав невлезающий кусок из пайпа. Есть ли еще способы?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.04.2011, 04:39
XaosLord, вы занимаетесь _лечением_последствий_
не используйте блокурующий API
либо используйте нативный AIO(чего бы я не советовал), либо обертки типа: asio, libevent
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
01.04.2011, 09:49
Поставьте O_NONBLOCK и не пытайтесь писать больше чем PIPE_BUF за 1 сискол.
Если писателей больше одного, а объем данных больше PIPE_BUF и нужна атомарность, то синхронизируйте ваши процессы любым доступным способом.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.04.2011, 13:36
Цитата Сообщение от XaosLord Посмотреть сообщение
все, заблочились, т.к. в пайп лезет всего 65536
Заблочилось не потому, что в пап лезет столько-то, а потому, что с другого конца пайпа это что-то прочитано не было.

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
и не пытайтесь писать больше чем PIPE_BUF за 1 сискол
Если писать 7 раз по 10000 байт, то будет такой же эффект. Правильнее было бы сказать, что если в пайп записано, но не прочтено данных более чем на размер буфера, то дальнейшие попытки записи будут висеть до тех пор, пока с другого конца не сделают чтение (в случае, если включен флаг блокировки) или вернётся код ошибки и в пайп ничего не запишется (если флаг блокировки выключен).

XaosLord, чтобы не играть в испорченный телефон, почитай man по pipe'у, там всё написано
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.04.2011, 13:36
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Поставьте O_NONBLOCK и не пытайтесь писать больше чем PIPE_BUF за 1 сискол.
зОчем?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
01.04.2011, 13:57
Если писать 7 раз по 10000 байт, то будет такой же эффект.
Либо вы неудачно цитируете (я говорил именно о не блокируемом режиме), либо это не верно.
write() на пайпе c O_NONBLOCK при записи <= PIPE_BUF и >PIPE_BUF ведет себя по разному:
1. запишет _весь_ кусок или вернет ошибку.
2. запишет сколько может (по наличию свободного места в буфере) или вернет ошибку.

Добавлено через 2 минуты
Цитата Сообщение от niXman Посмотреть сообщение
зОчем?
Зачем топик стартеру нужна неблокируемая запись в пайп я не знаю, а гадать не хочу.
Или вы что-то другое этим сказать хотите?
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.04.2011, 14:10
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Зачем топик стартеру нужна неблокируемая запись в пайп я не знаю, а гадать не хочу
Ему не нужна неблокируемая запись, ему нужно "отловить данный факт". Другими словами, человек не совсем понимает принципа работы с каналом, а потому пытается бороться с последствиями ошибки, а не с их причинами
0
3 / 3 / 0
Регистрация: 18.03.2009
Сообщений: 20
01.04.2011, 14:54  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Заблочилось не потому, что в пап лезет столько-то, а потому, что с другого конца пайпа это что-то прочитано не было.

Если писать 7 раз по 10000 байт, то будет такой же эффект. Правильнее было бы сказать, что если в пайп записано, но не прочтено данных более чем на размер буфера, то дальнейшие попытки записи будут висеть до тех пор, пока с другого конца не сделают чтение (в случае, если включен флаг блокировки) или вернётся код ошибки и в пайп ничего не запишется (если флаг блокировки выключен).

XaosLord, чтобы не играть в испорченный телефон, почитай man по pipe'у, там всё написано

Ему не нужна неблокируемая запись, ему нужно "отловить данный факт". Другими словами, человек не совсем понимает принципа работы с каналом, а потому пытается бороться с последствиями ошибки, а не с их причинами
Ты первый человек, с кем я это обсуждаю, кто меня понял.
Пойду, попробую почитать man по pipe.

Я понимаю принцип работы с каналом. Вообще, мне уже просто интересно - если процесс виснет, то должен же быть механизм узнать это. И возможность это зависание снять не убивая процесс.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.04.2011, 15:46
Цитата Сообщение от XaosLord Посмотреть сообщение
Я понимаю принцип работы с каналом
Мне правильнее было сказать, что ты не понимаешь технику (а не принцип) работы с каналами

Цитата Сообщение от XaosLord Посмотреть сообщение
Вообще, мне уже просто интересно - если процесс виснет, то должен же быть механизм узнать это
Он не виснет. В операционной системе вообще нет понятия "виснет". Процесс находится в состоянии ожидания. Внутри ядра такая информация по любому есть. Но вот можно ли её извлечь на пользовательском уровне - хз.

Цитата Сообщение от XaosLord Посмотреть сообщение
И возможность это зависание снять не убивая процесс.
Возможность есть - нужно прочитать из pipe, чтобы освободился буфер для записи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.04.2011, 15:46
Помогаю со студенческими работами здесь

read(); write();
Вот такая вот небольшая программка fstream myFileReader(&quot;hardware.dat&quot;, ios::in | ios::out); int example = 1; ...

Read/write property
Программирую на делфи, там есть read/write property. то есть при записи в поле - такое действие, при чтении - другое действие. Вот...

Функции write и read
Здравствуйте, уважаемые! Вопросы по работе с файлом через fstream. Возник вопрос по поводу записи структуры в нужном месте файла....

Cannot read or write variables of this type
Вообще не могу понять, почему вот эта программа в PascalABC работает без ошибок, а в Turbo Pascal выдает error 64: cannot read or write...

Write/Read (типизированный файл)
1) Если долбануть write когда находимся где-то в середине файла, аля truncate(обрежет)? 2) Если read считывает первый блок корректно, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru