Асинхронный ввод/вывод

Проблема

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

Решение

Откройте файл функцией sysopen с параметром O_NOCBLOCK:
use Fcntl;
sysopen(MODEM, "/dev/cua0", O_NONBLOCK|O_RDWR)
or die "Can't open modem: $!\n";
Если у вас уже есть файловый манипулятор, измените флаги с помощью функции fcntl:
use Fcntl;
$flags = '';
fcntl(HANDLE, F_GETFL, $flags)
or die 'Couldn't get flags for HANDLE: $!\n";
$flags |= O_NONBLOCK;
fcntl(HANDLE, F_SETFL, $flags)
or die "Couldn't set flags for HANDLE: $!\n";
После того как файловый манипулятор будет открыт для асинхронного ввода/вывода, измените флаги с помощью функции fcntl:
use POSIX qw(:errno_h);
$rv = syswrite(HANDLE, $buffer, length $buffer);
if (!defined($rv) && $! == EAGAIN)
  {
    # Ожидание
  }
elsif ($rv != length $buffer)
  {
    # Незавершенная запись
  } 
  else
    {
      # Успешная запись
    }
$rv = sysread(HANDLE, $buffer, $BUFSIZ);
or die "sysread: $! ";
if (!defined($rv) && $! == EAGAIN)
  {
    # Ожидание
  }
  else
    {
      # Успешно прочитано $rv байт из HANDLE
    }

Комментарий

Константа O_NONBLOCK входит в стандарт POSIX и потому поддерживается большинством компьютеров. Мы используем модуль POSIX для получения числового значения ошибки EAGAIN.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: