C++ Make std::O_NONBLOCK不能失败,或者Make stdin O_NONBLOCK保持标准阻塞?

C++ Make std::O_NONBLOCK不能失败,或者Make stdin O_NONBLOCK保持标准阻塞?,c++,stdout,iostream,nonblocking,fcntl,C++,Stdout,Iostream,Nonblocking,Fcntl,由于fcntl(标准文件号、设置符、fcntl(标准文件号、设置符)| O非块)而失败 为什么??如何修复保持stdin不阻塞 更新。 为什么?因为将标准设置为非块也会使标准设置为非块。并且std::out在其内部接收一些异步错误代码(比如ETRYAGAIN) 我看到两种解决办法: 使标准::不能在O_非块的情况下失败 使标准不阻塞保持标准阻塞 更新2。 该问题仅出现在MacOS上。Linux上没有AMD64,也没有Linux MIPS(AcCORs)。标准流不支持非阻塞文件描述符,超出了C

由于
fcntl(标准文件号、设置符、fcntl(标准文件号、设置符)| O非块)而失败

为什么??如何修复保持stdin不阻塞

更新。 为什么?因为将标准设置为非块也会使标准设置为非块。并且std::out在其内部接收一些异步错误代码(比如ETRYAGAIN)

我看到两种解决办法:

  • 使标准::不能在O_非块的情况下失败
  • 使标准不阻塞保持标准阻塞
更新2。
该问题仅出现在MacOS上。Linux上没有AMD64,也没有Linux MIPS(AcCORs)。

标准流不支持非阻塞文件描述符,超出了C++标准的范围。 如果您坚持对标准流使用非阻塞文件描述符,那么您需要实现一个可以读/写非阻塞文件描述符的流缓冲区。您可以通过派生和实现它的虚拟函数,或者使用优秀的工具,从零开始就可以做到这一点,从而大大减少您必须编写的样板代码的数量和复杂性。然后调用

std::cout
std::cin
和friends与您的特殊流缓冲区替换为
std::basic_ios::rdbuf

即使这样,使用
std::istream
std::ostream
接口,您也无法区分文件结尾和
EAGAIN



您可能想详细说明您目前正在解决的问题,因为当前的解决方案会产生更多的问题。

标准流不支持非阻塞文件描述符,这些超出了C++标准的范围。

如果您坚持对标准流使用非阻塞文件描述符,那么您需要实现一个可以读/写非阻塞文件描述符的流缓冲区。您可以通过派生和实现它的虚拟函数,或者使用优秀的工具,从零开始就可以做到这一点,从而大大减少您必须编写的样板代码的数量和复杂性。然后调用
std::cout
std::cin
和friends与您的特殊流缓冲区替换为
std::basic_ios::rdbuf

即使这样,使用
std::istream
std::ostream
接口,您也无法区分文件结尾和
EAGAIN



您可能希望详细说明您正试图解决的问题,因为您当前的解决方案会产生更多问题。

在您呼叫后,stdout是否也不阻塞?对它将non block设置为two
stdout O_NONBLOCK is:4 stdin O_NONBLOCK is:4
您使用的编译器、版本、编译器选项是什么?你在哪个站台?你使用C和C++标准库的实现方式是什么?我想,如果这是特定于OSX的,考虑用OSX标记它。我不能用glibc在linux上复制(在linux上
O_NONBLOCK=2048
)。@KamilCuk,谢谢你的回复,我添加了关于我的系统的详细信息。你的更新并没有真正解释你为什么希望
stdout
是非阻塞的。这样做有什么好处?如果尝试输出时生成了错误代码,那么听起来您好像遇到了X-Y问题,应该改为修复该问题。调用后stdout是否也是非阻塞的?对它将non block设置为two
stdout O_NONBLOCK is:4 stdin O_NONBLOCK is:4
您使用的编译器、版本、编译器选项是什么?你在哪个站台?你使用C和C++标准库的实现方式是什么?我想,如果这是特定于OSX的,考虑用OSX标记它。我不能用glibc在linux上复制(在linux上
O_NONBLOCK=2048
)。@KamilCuk,谢谢你的回复,我添加了关于我的系统的详细信息。你的更新并没有真正解释你为什么希望
stdout
是非阻塞的。这样做有什么好处?如果尝试输出时生成了错误代码,那么听起来您好像遇到了X-Y问题,应该予以解决。谢谢。我找到了一种拒绝非阻塞标准输入的方法,现在标准输出可以正常工作了。谢谢。我找到了一种拒绝非阻塞stdin的方法,现在stdout可以正常工作了。
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
using namespace std;

int main(){
        // Make stdin non-blocking
        fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK);

        printf("stdout O_NONBLOCK is: %d\n", fcntl(STDOUT_FILENO, F_GETFL) & O_NONBLOCK);
        printf("stdin O_NONBLOCK is: %d\n",  fcntl(STDIN_FILENO , F_GETFL) & O_NONBLOCK);

        for(int i=0; i<16; i++){
            cout<<"  "<<"fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er "<<endl;
        }
        bool cerrfail=cerr.fail(), coutfail=cout.fail();
        flush(cout); flush(clog); flush(cerr);
        cout.clear(); cerr.clear(); clog.clear();
        cerr<<"\ncerr.fail():"<<cerrfail<<" cout.fail():"<<coutfail<<endl;
}
stdout O_NONBLOCK is: 4
stdin O_NONBLOCK is: 4
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo erouhep hv reough er 
  fgvbhln;j;jblhcbwnoi wiejnocje ocweo cewoj coj weoj cowejojewohewouspuweoche njwpihbeh wjo ero
cerr.fail():0 cout.fail():1