Есть ли способ контролировать размер буфера именованного канала, созданного через mkfifo
?
Я использую macOS 10.13.2 и размер буфера кажется фиксированным в 8192 байта. Я смог добраться до этого числа с помощью этого фрагмента кода:
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <thread>
#define BUFFER_SIZE 1024*1024
#define FIFO_PATH "/Users/joao/Desktop/fifo"
void readFifo() {
auto fd = open(FIFO_PATH, O_RDONLY);
if (fd < 0) {
std::cerr << "Failed to open fifo for reading" << std::endl;
return;
}
std::cout << "Ready to read!" << std::endl;
char buffer[BUFFER_SIZE];
auto total_bytes_read = 0;
while (total_bytes_read < BUFFER_SIZE) {
auto bytes_read = read(fd, buffer, BUFFER_SIZE);
std::cout << "Read " << bytes_read << " bytes" << std::endl;
total_bytes_read += bytes_read;
}
close(fd);
}
int main(int argc, const char * argv[]) {
unlink(FIFO_PATH);
if (mkfifo(FIFO_PATH, 0666) != 0) {
std::cerr << "Failed to create fifo" << std::endl;
return 1;
}
std::thread reader(readFifo);
auto fd = open(FIFO_PATH, O_WRONLY);
if (fd < 0) {
std::cerr << "Failed to open fifo for writing" << std::endl;
return 1;
}
char buffer[BUFFER_SIZE];
for (int i = 0; i < BUFFER_SIZE; i++) {
buffer[i] = 'a';
}
auto bytes_written = write(fd, buffer, BUFFER_SIZE);
reader.join();
std::cout << "Wrote " << bytes_written << " bytes" << std::endl;
unlink(FIFO_PATH);
return 0;
}
Задача ещё не решена.
Других решений пока нет …