Async File IO под Unix и выяснение количества оставшихся байтов - PullRequest
0 голосов
/ 02 ноября 2010

Я делаю асинхронный файловый ввод / вывод под Unix, используя open / close / etc.У меня все работает нормально, и я могу инициировать фоновое чтение и запись и ждать, пока они закончат использовать select.

Однако у меня осталась одна проблема.Я хотел бы выяснить, сколько данных осталось для чтения / записи.
Теперь я предполагаю, что это простой вызов ioctl, но я могу найти очень мало полезной документации по этому вопросу: (

Любой, ктоможет помочь будет высоко ценится!

Ответы [ 4 ]

2 голосов
/ 02 ноября 2010

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

Не знаю, как вы узнали бы, сколько данных осталось написать, так как именно вы пишете их.Это будет зависеть от вашего собственного кода.

1 голос
/ 04 ноября 2010

Вы можете использовать fcntl(), чтобы установить ваш сокет / трубу неблокирующим.Все вызовы read() будут считывать доступные данные, а вызовы write() будут записывать как можно больше данных без блокировки.В обоих случаях количество прочитанных / записанных данных находится в возвращаемом значении.

Пример без проверки ошибок:

    int flags = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);

Затем после select() и для всех уведомленных дескрипторов вызовитечто-то вроде:

    if (buffer_sent < buffer_size)
        buffer_sent += write(socket, buffer+buffer_sent, buffer_size - buffer_sent);

Просто для повторения, прежде чем я буду разгорячен: полное решение будет включать проверку ошибок.

Поиск в поиске «неблокирующего ввода-вывода» приведет к более полномупроработанные примеры:)

1 голос
/ 04 ноября 2010

Если это Solaris, fstat вернет количество байтов в канале.Другие юниксы этого не делают.

Кроме того,

S_ISFIFO(st.st_mode) 

сообщит вам, является ли открытый поток каналом или нет, а st - структурной статистикой.Это верно для всех разновидностей Unix.

1 голос
/ 02 ноября 2010

Вы не можете достоверно сказать.

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

"Файл" может фактически быть локальным или сетевым каналом, а не файлом вообще. В этом случае данные заканчиваются только после закрытия канала.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...