免费注册 查看新帖 |

Chinaunix

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

关于dup2()的疑问. [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
21 [报告]
发表于 2004-02-18 17:53 |只看该作者

关于dup2()的疑问.

你的要求很奇怪哦。
那样的话你用fprintf()吧。
也没这么麻烦了。

论坛徽章:
0
22 [报告]
发表于 2004-02-18 18:29 |只看该作者

关于dup2()的疑问.

原帖由 "converse" 发表:
dup2(id, STDOUT_FILENO);
printf("world\n";

return 0;


在 dup2 (id, STDOUT_FILENO); 之前加入


  1. fflush (stdout);
复制代码


就能达到你要求的效果了。该死的缓冲.....

对另一个问题, 我认为只有写过 ''真正的程序'' 后才能融会贯通。如果没有参加实际项目的机会,可以多看看代码。

论坛徽章:
0
23 [报告]
发表于 2004-02-18 21:55 |只看该作者

关于dup2()的疑问.

我明白了,fflush函数把原来的test和hello强行写入打开的文件中,然后由于stdut被重新定位到屏幕上所以就在屏幕上输出world了,对吧??

我现在比较的郁闷,虽然找了一个作LINUX的公司,不过作的东西好象和我想像的有分别,暂时还用不上APUE里的知识,缺少了在实际中的锻炼学起来自然慢的多,我看了一下APUE后面有几个实际的例子,不过好象是数据库的,然后是打印机的,我这些都没有学过呀,不知道看过这本书的朋友感觉怎么样呢?

个人觉得APUE对于初学者来说太难了,很多基础的概念一带而过,还是lenovo推荐过的《UNIX程序设计教程》不错,把这两本书结合在一起看学的很快,就是可惜的是没有实践的锻炼,郁闷呀。。。。。。。。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
24 [报告]
发表于 2004-02-18 22:35 |只看该作者

关于dup2()的疑问.

原帖由 "converse" 发表:
我明白了,fflush函数把原来的test和hello强行写入打开的文件中,然后由于stdut被重新定位到屏幕上所以就在屏幕上输出world了,对吧??

我现在比较的郁闷,虽然找了一个作LINUX的公司,不过作的东西好象和我想像..........

我看APUE看的也很慢,现在看到进程高级通信那里了,
时间也不是很充足。不过感觉用处还是很大的,
很多不明白的地方,那本书都说了。

论坛徽章:
0
25 [报告]
发表于 2004-02-19 09:45 |只看该作者

关于dup2()的疑问.

说来惭愧,虽然我一直向别人大力推荐APUE,但是自己从来没有从头到尾看过一遍。我把它当作一本开发手册,用到时再去翻翻,呵呵。

论坛徽章:
0
26 [报告]
发表于 2004-02-19 11:01 |只看该作者

关于dup2()的疑问.

[quote="win_hate"]
在 dup2 (id, STDOUT_FILENO); 之前加入

代码:

fflush (stdout);


quote]

我没有加fflush (stdout); 也没有出现问题啊!为什么呢?我是在linux下运行的。

论坛徽章:
0
27 [报告]
发表于 2004-02-19 11:41 |只看该作者

关于dup2()的疑问.

原帖由 "flyingbxf" 发表:



quote]

我没有加fflush (stdout); 也没有出现问题啊!为什么呢?我是在linux下运行的。


我记得你是做嵌入式开发的,可能是环境不同。你换个台式机试一试可能就有这个问题。

论坛徽章:
0
28 [报告]
发表于 2004-02-19 18:32 |只看该作者

关于dup2()的疑问.

dup2首先close标准输出,然后把标准输出的文件描述符1传到fd所代表的结构中?
close(fd)其实是close了一个没有用的数(3),fclose关闭的也是这个数字(3),可以通过fileno看到。所以还可以写道这个文件中。如果关闭了close(1),则不行了。
看来FILE和文件描述符最好不一起使用。不然一定要当心啊。

论坛徽章:
0
29 [报告]
发表于 2004-02-19 20:20 |只看该作者

关于dup2()的疑问.

原帖由 "win_hate" 发表:


你写错了吧?这几行程序一般相当于:

int saved_fd;
save_fd = 2;
dup2 (2, 2);

这怎么行?

说错了,stdout应该是1,2是stderr。

论坛徽章:
0
30 [报告]
发表于 2004-02-19 20:42 |只看该作者

关于dup2()的疑问.

原帖由 "kj501" 发表:

int saved_fd ;
saved_fd = STDOUT_FILENO; /* 保存标准输出 */

dup2(saved_fd, STDOUT_FILENO); /* 恢复标准输出 */

我来检讨一下,由于我对dup2的使用在概念有理解错误,我给出的例子是行不通的。
经过试验,我发现dup2(int oldfd, int newfd)其中的newfd必须是一个实际打开文件的文件描述符,不能只是一个不指向任何文件的整数。
这是我作试验的代码:

  1. #include<unistd.h>;
  2. #include<stdlib.h>;
  3. #include<fcntl.h>;
  4. #include<sys/types.h>;
  5. #include<sys/stat.h>;

  6. int main()
  7. {
  8.         int sfd,testfd;

  9.         testfd = open("temp",O_CREAT | O_RDWR | O_APPEND);

  10.         if (-1 == testfd) {
  11.                 printf("open file error.\n");
  12.                 exit(1);
  13.         }

  14.         /* 先复制一个真实的文件描述符 */
  15.         sfd = dup(testfd);

  16.         /* 保存标准输出 */
  17.         if (-1 == dup2(STDOUT_FILENO,sfd) ) {
  18.                 printf("can't save fd \n");
  19.                 exit(1);
  20.         }

  21.         /* 重定向 */
  22.         if (-1 == dup2(testfd,STDOUT_FILENO) ) {
  23.                 printf("can't redirect fd error\n");
  24.                 exit(1);
  25.         }

  26.         /* 此时向stdout写入应该输出到文件 */
  27.         write(STDOUT_FILENO,"file\n",5);

  28.         /* 恢复stdout */
  29.         if (-1 != dup2(sfd,STDOUT_FILENO) ) {
  30.                 printf("recover fd ok \n");

  31.                 /* 恢复后,写入stdout应该向屏幕输出 */
  32.                 write(STDOUT_FILENO,"stdout\n",7);
  33.         }
  34. }
复制代码

如果把其中的这一行注释掉:

  1. sfd = dup(testfd);
复制代码

dup2函数执行时肯定会失败。
但从代码中也可以看出,我前面提出的先保存文件描述符,然后在重定向之后再恢复回来的思路是行得能的。
有不当之处,还请大家多多指教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP