免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4617 | 回复: 2
打印 上一主题 下一主题

dup2 后close第一个fd? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-25 11:35 |只看该作者 |倒序浏览
看到一段代码,把输入,输出,错误都重定向到/dev/null
  1. int
  2. daemon(nochdir, noclose)
  3.     int nochdir, noclose;
  4. {
  5.     int fd;

  6.     switch (fork()) {
  7.     case -1:
  8.         return (-1);
  9.     case 0:
  10.         break;  
  11.     default:
  12.         _exit(0);
  13.     }

  14.     if (setsid() == -1)
  15.         return (-1);

  16.     if (!nochdir)
  17.         (void)chdir(”/”);

  18.     if (!noclose && (fd = open(”/dev/null”, O_RDWR, 0)) != -1) {
  19.         (void)dup2(fd, STDIN_FILENO);
  20.         (void)dup2(fd, STDOUT_FILENO);
  21.         (void)dup2(fd, STDERR_FILENO);
  22.         if (fd > STDERR_FILENO)
  23.             (void)close(fd);
  24.     }
  25.     return (0);
  26. }
复制代码
不太明白的是为何要(void)close(fd); ?上面的三个dup2 已经把输入,输出,错误关闭(根据apue),然后指向fd了。现在关闭fd,岂不是把输入,输出,和错误的文件描述符也都关闭了吗?那重定向就白做了,可以直接close(STDIN_FILENO);…… ?

论坛徽章:
0
2 [报告]
发表于 2012-03-25 23:59 |只看该作者
dup2(fd, STDIN_FILENO) 在STDIN_FILENO上打开fd所指向的文件,若STDIN_FILENO原来是打开的则首先先关闭那个
这实际上实现了重定向,但是并没有关闭fd,
所以如果一开始环境为程序打开了0,1,2,那么fd最起码是3,因此有必要关它一下

论坛徽章:
0
3 [报告]
发表于 2012-03-26 00:10 |只看该作者
大致明白意思了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP