aio_read из STDIN_FILENO возвращает EAGAIN в OS X

Когда я компилирую этот код в OS X:

#include <unistd.h>
#include <iostream>
#include <memory>
#include <aio.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;

int main(int, char*[])
{
const int iBufSize = 1<<20;
unique_ptr<char[]> pBuffer(new char[iBufSize]);
int iRet;

int iOpts = fcntl(STDIN_FILENO, F_GETFL);
cout << "GETFL Before: " << iOpts << endl;
fcntl(STDIN_FILENO, F_SETFL, iOpts & ~O_NONBLOCK);
iOpts = fcntl(STDIN_FILENO, F_GETFL);
cout << "GETFL After: " << iOpts << endl;

aiocb cb = {0};
cb.aio_fildes = STDIN_FILENO;
cb.aio_buf = pBuffer.get();
cb.aio_nbytes = iBufSize;
iRet = aio_read(&cb);
cout << "aio_read retuned " << iRet << endl;
cout << "errno = " << strerror(errno) << "(" << errno << ")" << endl;
return 0;
}

скомпилируйте его с помощью g ++, затем выполните его так:

echo "Hello" | ./aio_read\ demo

это возвращает:

GETFL Before: 0
GETFL After: 0
aio_read retuned -1
errno = Resource temporarily unavailable(35)

Зачем? Если я запускаю это без предшествующего echo "Hello" | это работает как ожидалось. Кроме того, вызовы fcntl не обязаны вызывать проблему, но они показывают, что STDIN не имеет O_NONBLOCK задавать.

0

Решение

Задача ещё не решена.

Другие решения