В Linux после записи некоторых данных в канал (еще не прочитанных) при использовании fstat на стороне чтения/записи канала поле st_size равно нулю. Можно ли получить размер данных, доступных в канале?
Образец кода:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#define BUFLEN 8
int main() {
char buf[BUFLEN];
int fd[2];
struct stat sb;
pipe(fd);
write(fd[1], buf, BUFLEN);
fstat(fd[1], &sb); // the same for fd[0]
printf("pipe size=%ld\n", sb.st_size); // print 0
exit(0);
}
Когда-то очень давно я работал над системой, которая fstat() предоставляла информацию (если быть точным, ICL Perq, работающий под управлением PNX). Как только я перешел на другие варианты Unix (эон минус около трех лет назад), я был разочарован, обнаружив, что он не работает на этих машинах.





На странице руководства Pipe(7) написано следующее:
The following ioctl(2) operation, which can be applied to a file descriptor that refers to either end of a pipe, places a count of the number of unread bytes in the pipe in the int buffer pointed to by the final argument of the call: ioctl(fd, FIONREAD, &nbytes); The FIONREAD operation is not specified in any standard, but is provided on many implementations.
Поэтому в некоторых системах есть нестандартная ioctl операция для получения количества непрочитанных байтов в канале.
Нет, невозможно узнать, сколько данных он в конечном итоге будет содержать. ОС в какой-то момент заблокируется, если записывающее устройство заполнит доступные буферы.