免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2008-04-17 11:33 |只看该作者
原帖由 swordfish.cn 于 2008-4-11 12:34 发表
从strace的情况来看,dup2并没有实际想像那样操作。
在lighttpd里面是这样关闭stdin的。

575     /* close stdin and stdout, as they are not needed */
576     /* move stdin to /dev/null */
577  ...


close(xxx_FILENO)没有必要,这种写法画蛇添足,不应提倡。
在多线程环境下会有racing。

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


是一样的啊.


如果一样的话,为什么./test 1>out没有输出到out里呢?
我原来的理解./test 1>out shell大概会在程序中有类似如下的动作
fd = open("out", ...);
dup2(fd, 1);

如果是这样的话write(1, ...)怎么会不写到out中呢?

论坛徽章:
0
23 [报告]
发表于 2008-04-17 13:54 |只看该作者
原帖由 bierdaci 于 2008-4-17 11:37 发表


如果一样的话,为什么./test 1>out没有输出到out里呢?
我原来的理解./test 1>out shell大概会在程序中有类似如下的动作
fd = open("out", ...);
dup2(fd, 1);

如果是这样的话write(1, ...)怎么会不写 ...


因为楼主这个是特殊的情况, 此时的STDOUT_FILENO也即是1已经被关闭了.

论坛徽章:
0
24 [报告]
发表于 2008-04-17 15:09 |只看该作者
原帖由 scutan 于 2008-4-17 13:54 发表


因为楼主这个是特殊的情况, 此时的STDOUT_FILENO也即是1已经被关闭了.


大概你没有看明白我的问题了

算了,还是不讨论吧

论坛徽章:
0
25 [报告]
发表于 2008-04-17 15:51 |只看该作者
原帖由 JohnBull 于 2008-4-17 11:33 发表


close(xxx_FILENO)没有必要,这种写法画蛇添足,不应提倡。
在多线程环境下会有racing。



哈哈,这个是 lighttpd 的代码,没有多线程。
不过多线程情况下确实会有这个问题。

论坛徽章:
0
26 [报告]
发表于 2008-04-17 21:10 |只看该作者

回复 #1 cu_liang 的帖子

你这个例子一点问题都没有啊!
dup2 之后原来的旧的fd和新fd都指向同一个文件了。
After a successful return from dup() or dup2(), the old and new file descriptors may be used interchangeably. They refer to the same open file description (see open(2)) and thus share file offset and file status flags; for example, if the file offset is modified by using lseek(2) on one of the descriptors, the offset is also changed for the other.

仔细看看man dup2

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


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


#include
#include
#include
#include
#include

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


厉害啊。看到这样的回复,我恨不得拜师

论坛徽章:
0
28 [报告]
发表于 2008-04-21 16:26 |只看该作者
应该是标准输入和终端是相连的。

这几天我也正在看APUE,看下APUE的程序1-2,从标准输入复制数据到标准输出。
运行程序后,输入asdfgh,再回车
就会再显示一行   asdfgh.

也就是说第一行asdfgh是输入的,由于标准输入和终端相连,所以会回显在终端上,第二行的asdfgh才是从程序从标准输入复制到终端上的数据.

论坛徽章:
0
29 [报告]
发表于 2008-04-22 14:24 |只看该作者
打开/dev/fd ,查看文件0 1 2,全部指向了同一个终端 symbolic link to `/dev/pts/n'

论坛徽章:
0
30 [报告]
发表于 2008-04-28 11:02 |只看该作者
可是为什么标准输入与终端项链就把结果输出都终端。它毕竟是输入,是要接收终端的数据的。
难道还能像终端写???不是只读方式打开的?

[ 本帖最后由 源方 于 2008-4-28 11:18 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP