免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cu_liang
打印 上一主题 下一主题

用dup2()能关闭标准输出吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-04-13 22:42 |只看该作者
另外,楼主可以看看APUE2中3.12节的那个图,此时相当于是fd1与fd0都指向了fd0之前指向的那个file table。所以说你此时能够打印出东西来。

论坛徽章:
0
12 [报告]
发表于 2008-04-13 23:30 |只看该作者

回复 #10 scutan 的帖子

果然如此!将程序改为如下就不能输出“how!!”了
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. int main()
  5. {
  6.     int fd;
  7.     fd = open( "./1.txt", O_CREAT|O_RDWR );
  8.     printf( "the fd is :%d\n", fd );
  9.     dup( fd, STDOUT_FILENO );
  10.     printf( "how!!\n" );
  11. }
复制代码
不过,奇怪的是为什么将字符写入标准输入后,这些字符会在屏幕上打印出来,难道就是因为标准输入跟终端相连了?

论坛徽章:
0
13 [报告]
发表于 2008-04-13 23:42 |只看该作者
原帖由 cu_liang 于 2008-4-13 23:30 发表
果然如此!将程序改为如下就不能输出“how!!”了#include
#include
#include
int main()
{
    int fd;
    fd = open( "./1.txt", O_CREAT|O_RDWR );
    printf( "the fd is :%d\n", fd );
     ...


我想应该就是这个原因,至于具体的实现我也不是太清楚,抱歉。

论坛徽章:
0
14 [报告]
发表于 2008-04-13 23:52 |只看该作者

回复 #13 scutan 的帖子

还是非常感谢你。
我想知道dup2是具体是如何实现也就是为了要搞清楚为什么会输出“how”
现在既然搞清楚了,就不需要知道dup2是如何实现的了,至少是暂时不需要了,呵呵。

论坛徽章:
0
15 [报告]
发表于 2008-04-14 11:55 |只看该作者
此时STDIN_FILENO,STDOUT_FILENO两个都指向的是标准输入,也即是0的那个文件表,而这个又与终端相连,所以能够输出数据来。


Oh,原来是这样。没想到“标准输入”并不仅仅是“输入”。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
16 [报告]
发表于 2008-04-14 19:30 |只看该作者
原帖由 swordfish.cn 于 2008-4-13 20:47 发表


M版,这个说法不对吧。在 manpage 中如是说:


所以返回 1 的话,那执行应该是成功了吧。
但是事实上的效果却又有不同,所以我只好把它看作一个特例了。

嗯,我当时看的是 Mac OS X 自带的文档(BSD 的),估计和 Linux 的又差异,而且我当时试验楼主的代码,调用 dup2 的返回值也是 -1。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
17 [报告]
发表于 2008-04-14 19:32 |只看该作者
原帖由 cu_liang 于 2008-4-13 23:30 发表
不过,奇怪的是为什么将字符写入标准输入后,这些字符会在屏幕上打印出来,难道就是因为标准输入跟终端相连了?

估计 Shell 打开终端设备文件的时候用的是读写方式,所以既能读,也能写。

论坛徽章:
0
18 [报告]
发表于 2008-04-15 10:51 |只看该作者
标准输入默认会在终端回显,关闭回显就不会看到 how!! 了

论坛徽章:
0
19 [报告]
发表于 2008-04-17 00:17 |只看该作者
原帖由 scutan 于 2008-4-13 22:39 发表


其实重点不是在dup2(),对于下面的代码:


#include
#include
#include
#include
#include

int main()
{
        close(STDOUT_FILENO);
        write(0, "hello\n", 6);
        return 0 ...


你这个实验让我对shell重定向原理产生了疑惑,./test 1>out中的"1"和write(1, .....)中的"1"难道不一样?

论坛徽章:
0
20 [报告]
发表于 2008-04-17 10:09 |只看该作者
原帖由 bierdaci 于 2008-4-17 00:17 发表


你这个实验让我对shell重定向原理产生了疑惑,./test 1>out中的"1"和write(1, .....)中的"1"难道不一样?


是一样的啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP