Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [pipe] возможность прервать блокирующую операцию 
:(
    Опции темы
cupper
Дата 22.3.2012, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(rsm @  22.3.2012,  20:03 Найти цитируемый пост)
 А теперь представим, что будет, если каждый вызов функции signal выполняется в отдельном потоке.

А ну это то понятно было изначально. Речи об использовании этой функции не было.
Цитата(rsm @  22.3.2012,  20:03 Найти цитируемый пост)
У каждого процесса есть его текущая маска сигналов. Функция sigprocmask, принимая как аргумент новую маску сигналов, позволяет выполнить следующие действия:
а) SIG_BLOCK - добавить к текущей маске сигналы, заданные в новой маске;
б) SIG_SETMASK - установить текущую маску полностью идентичной новой маске;
в) SIG_UNBLOCK - убрать из текущей маски сигналы, заданные в новой маске;

Добрался до домашнего компа, и таки понял где я "промахнулся". Именно в нонимании это функции. Вернее в том что SIG_BLOCK/SIG_UNBLOCK это не указание на то что блокировать или не блокировать сигналы, как в сигнал в signal - SIG_IGN. Я не знал что у процесс изначально есть маска сигналов которая именно заблокирована. Я думал что sigprocmask как раз позволяет сделать блокировку этих сигналов. А привело меня к этому наверно неправильное толкование вот этого описания
Цитата

ibm

Typically, sigprocmask(SIG_BLOCK, ..., ...) is used to block signals during a critical section of code. At the end of the critical section of code, sigprocmask(SIG_SETMASK, ..., ...) is used to restore the mask to the previous value returned by sigprocmask(SIG_BLOCK, ..., ...).

option
Indicates the way in which the existing set of blocked signals should be changed. The following are the possible values for option, defined in the signal.h header file:
SIG_BLOCK
Indicates that the set of signals given by new_set should be blocked, in addition to the set currently being blocked.
SIG_UNBLOCK
Indicates that the set of signals given by new_set should not be blocked. These signals are removed from the current set of signals being blocked.
SIG_SETMASK
Indicates that the set of signals given by new_set should replace the old set of signals being blocked.


Еще раз спасибо smile Но это еще не все, щас подготовлю пример для последнего наверно вопроса. На счет sigaction в тредах.

PS. sigaction работает на весь процесс и на каждую нить. А основное мое не поние было в том что функции sigwait и ppoll в обработке сигналов различаются как земля и небо. sigwait не позволяет выполниться обработчику (из sigaction). ppoll напротив позволяет. 

Гип гип ура, мать его. Наконец таки я доделаю свои долбаные пайпы.
Прибольшое спасибо вам rsm, мне б к вам в ученики smile

Это сообщение отредактировал(а) cupper - 22.3.2012, 23:11
PM MAIL   Вверх
rsm
Дата 23.3.2012, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 3
Всего: 62



Цитата(cupper @  22.3.2012,  23:58 Найти цитируемый пост)
Прибольшое спасибо вам rsm, мне б к вам в ученики

Форум решает smile
PM MAIL   Вверх
cupper
Дата 25.3.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(cupper @  15.3.2012,  22:33 Найти цитируемый пост)
Второй вариант, используем неблокирующий режим
Код

mkfifo(FIFO_FILE, 0666)
handle_ = open(FIFO_FILE, O_RDWR | O_NONBLOCK);
int flags;
if ((flags = fcntl(handle_, F_GETFL, 0)) < 0) printf("ERROR: fcntl get\n");
flags &= ~O_NONBLOCK;
if (fcntl(handle_, F_SETFL, flags) < 0) printf("ERROR: fcntl set\n");
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(handle_, &rfds);
if(select(handle_ + 1, NULL, &rfds, &rfds, NULL) == -1)

Пояснение 1: после того как мы "открыли" pipe переводим его в блокирующий режим иначе каждая наша операция будет сразу возвращаться управление.
Пояснение 2: используем select, но мы не можем использовать его для операции read так как она возвращает 0 на еще не открытом pipe, поэтому открываем pipe в оба режима, и блокируемся на операции write.


собрав силы в кулак я вернулся к старому коду. Увидев в примере rsm использование ppoll (когда происходило блокирование при чтении в O_NONBLOCK pipe) я решил что это просто такая хорошая функция которая лучше чем pselect. Решил в этом убедится, достал свой код с select, поменял на 
Код

    mkfifo(PIPE, 0666);
    int hdl = open(PIPE, O_RDONLY | O_NONBLOCK);    
    fd_set fd;
    FD_ZERO(&fd);
    FD_SET(hdl, &fd);
    std::cout << "after select\n";
    select(hdl + 1, &fd, NULL, NULL, 0);
    std::cout << "before select\n";

и тут мне стало совсем дурно, потому что операция select заблокировалась на чтении. Но это невозможно !!! Ведь просто операция чтения вставленная строчкой выше select пролетает и возвращает 0. Как ???? Как он блокируется ??? Я рву волосы на голове пытаясь вспомнить как я писал код (а я его писал, и не в одной вариации) что у мня select не блокировался, не блокировался даже на запись если я открывал pipe как O_RDWR | O_NONBLOCK. Но увы, код утерян, и я не могу получить пример в подтверждение своих слов в начале поста. Я ей богу не понимаю почему теперь select блокируется.
PM MAIL   Вверх
xvr
Дата 25.3.2012, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(cupper @  25.3.2012,  19:15 Найти цитируемый пост)
Ведь просто операция чтения вставленная строчкой выше select пролетает и возвращает 0. Как ????

Это нормально. Ваша 'операция чтения строчкой выше' вылетела с нулем потому что был выставлен флаг O_NONBLOCK, который означает - 'операции ввода/вывода никогда не блокировать'. Но на select это не распространяется (его на то и сделали, что бы можно было ждать реального поступления данных)

PM MAIL   Вверх
cupper
Дата 26.3.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(xvr @  25.3.2012,  22:53 Найти цитируемый пост)
Это нормально. Ваша 'операция чтения строчкой выше' вылетела с нулем потому что был выставлен флаг O_NONBLOCK, который означает - 'операции ввода/вывода никогда не блокировать'. Но на select это не распространяется (его на то и сделали, что бы можно было ждать реального поступления данных)

да ну ладно вам
Цитата

select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation (e.g., input possible). A file descriptor is considered ready if it is possible to perform the corresponding I/O operation (e.g., read(2)) without blocking.


PM MAIL   Вверх
xvr
Дата 26.3.2012, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(cupper @  26.3.2012,  08:48 Найти цитируемый пост)
A file descriptor is considered ready if it is possible to perform the corresponding I/O operation (e.g., read(2)) without blocking.

Но это не значит, что он обратит внимание на флаг O_NONBLOCK. И он не обращает  smile 
Так что тут надо читать так : 
Цитата

A file descriptor is considered ready if it is possible to perform the corresponding I/O operation in blocking mode (e.g., read(2)) without blocking.

PM MAIL   Вверх
cupper
Дата 26.3.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(xvr @  26.3.2012,  13:03 Найти цитируемый пост)
Но это не значит, что он обратит внимание на флаг O_NONBLOCK. И он не обращает

хе smile тут даже и не поспоришь... в мане собстно не сказано ни первое ни второе. Странно, ведь про таймер они там во все горло кричат что это опасные грабли.
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.