Linux C,为什么fcntl对STDIN的行为也会影响STDOUT和STDERR?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux C,为什么fcntl对STDIN的行为也会影响STDOUT和STDERR?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1559字,纯文字阅读大概需要3分钟。
内容图文
![Linux C,为什么fcntl对STDIN的行为也会影响STDOUT和STDERR?](/upload/InfoBanner/zyjiaocheng/954/bbbc208ac8f2484e99c7f01788e2110b.jpg)
我在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);
这是我的问题代码.
解决方法:
登录过程(或终端打开过程)传统上使用的“技巧”之一是以文件描述符0(标准输入)的读写模式打开终端,然后复制文件描述符1和2(标准输出)和标准错误).这意味着:
>所有三个标准文件描述符共享相同的打开文件描述.
>您可以写入标准输入并从标准输出或标准错误读取.
>更改一个文件描述信息会更改其他信息.
fcntl()的F_GETFL和F_SETFL选项与打开的文件描述有关.
fcntl()的F_GETFD和F_SETFD选项与文件描述符相关.
给定的打开文件描述可能有多个文件描述符,在一个进程内(在dup()或dup2()之后)或跨进程(由于fork()).
内容总结
以上是互联网集市为您收集整理的Linux C,为什么fcntl对STDIN的行为也会影响STDOUT和STDERR?全部内容,希望文章能够帮你解决Linux C,为什么fcntl对STDIN的行为也会影响STDOUT和STDERR?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。