【发布时间】:2013-10-21 11:57:35
【问题描述】:
我在stdin 上执行函数fcntl 时遇到了一个问题,当我将stdin FD 状态标志设置为O_NONBLOCK 时,它运行良好但有副作用。 stdout 和 stderr 的状态标志也改为O_NONBLOCK。
我研究了函数fcntl、SYSCALL_DEFINE3和do_fcntl的源代码,但没有任何帮助。还有stackoverflow或谷歌。我认为它可能与内核或 glibc 实现有关。
我的电脑是 x86_64 上的 Ubuntu 12.04,安装了 gcc 4.6.3。
int flag = 0;
int value = O_NONBLOCK;
int fd = open("./tmp", O_RDONLY);
if(-1 == (flag = fcntl(fd, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
if(-1 == (flag = fcntl(stdout->_fileno, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));
flag = fcntl(stdout->_fileno, F_SETFL, flag | O_NONBLOCK);
flag = fcntl(fd, F_GETFL);
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stdout->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
flag = fcntl(stdin->_fileno, F_SETFL, flag | O_APPEND);
flag = fcntl(fd, F_GETFL);
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stdout->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
close(fd);
这是我解决这个问题的代码。
【问题讨论】:
-
发布一些代码怎么样?
-
你试过不使用tty的时候(例如
echo "" | ./your_program)吗? -
是的。谢谢!我只是
gdb a.out,并显示标志,当将O_NONBLOCK 设置为stdout 时,我得到stdin 和stderr 都有O_NONBLOCK。很迷茫~