免费注册 查看新帖 |

Chinaunix

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

[算法] 越是看似简单的问题越是要命——stdin与STDIN_FILENO [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
61 [报告]
发表于 2013-02-07 15:16 |只看该作者
一介村夫 发表于 2013-02-07 14:47
见51楼。不重定向无所谓,重定向就麻烦了。
两个不同值的fd都能接收输入,如果你重定向时只重定向一个, ...


看不出有什么所谓来, 原来就是输入只有一个, 你将输入重定向到文件, 他怎么就有两个了?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
62 [报告]
发表于 2013-02-07 15:53 |只看该作者
@zylthinking
his code:
  1. fclose(stdout);
  2. open("test.txt", O_CREAT|O_RDWR, 0600);
  3. freopen(stdout);
  4. system("ls");
复制代码
the right one is:
  1. fclose(stdout);
  2. open("test.txt", O_CREAT|O_RDWR, 0600);
  3. freopen(stdout);
  4. dup2(fileno(stdout),STDOUT_FILENO);
  5. system("ls");
复制代码

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
63 [报告]
发表于 2013-02-07 16:11 |只看该作者
本帖最后由 zylthinking 于 2013-02-07 16:40 编辑
folklore 发表于 2013-02-07 15:53
@zylthinking
his code:the right one is:
  1. fclose(stdout);
  2. open("test.txt", O_CREAT|O_RDWR, 0600);
  3. freopen(stdout);
  4. dup2(fileno(stdout),STDOUT_FILENO);
  5. system("ls");
复制代码
这代码也不见得正确
我看不出 open 和 freopen 有什么关系来, 更看不出 system 和 重定向有什么关系;以及 dup 在这里有什么用;

这段代码其实说白了2句就行
freopen("test.txt", "w", stdout);
system("ls");
就足以重定向了,剩下几句, 要么画蛇添足, 要么根本毫无必要。

但这样也是达不到让 ls 输出到 txt 的目的的,
就算 system 是通过本进程 fork 而来, 从而继承了描述字, 在 execl ls 时也会关闭并重新打开 /dev/stdout 和之前的重定向没有任何关系; 更何况, ls 也未必一定使用 printf 系列进行输出, 它直接打开 /dev/stdout 设备来写, 神也阻止不了它

日了, 一不小心就胡说八道了, stdin, out, err 本就不是操作系统概念, execl 更不会主动打开这几个fd, 这是 c run time 做的。

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
64 [报告]
发表于 2013-02-07 19:06 |只看该作者
folklore 发表于 2013-02-07 15:53
@zylthinking
his code:the right one is:

自作聪明,画蛇添足,驴唇不对马嘴。

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
65 [报告]
发表于 2013-02-07 19:08 |只看该作者
zylthinking 发表于 2013-02-07 16:11
这代码也不见得正确
我看不出 open 和 freopen 有什么关系来, 更看不出 system 和 重定向有什么关系;以及 ...

fork和exec都不会重新打开std设备。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
66 [报告]
发表于 2013-02-07 20:36 |只看该作者
一介村夫 发表于 2013-02-07 19:08
fork和exec都不会重新打开std设备。


是啊, 我就不明白你到底想要做什么, 或者说, 如果确保了 fileno(stdin) == STDIN_FILENO, 你能利用它来做什么

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
67 [报告]
发表于 2013-02-07 22:14 |只看该作者
zylthinking 发表于 2013-02-07 20:36
是啊, 我就不明白你到底想要做什么, 或者说, 如果确保了 fileno(stdin) == STDIN_FILENO, 你能利用 ...

我只想要好像没有做过fclose(stdin)的效果。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
68 [报告]
发表于 2013-02-07 22:24 |只看该作者
一介村夫 发表于 2013-02-07 22:14
我只想要好像没有做过fclose(stdin)的效果。


要效果不具体, 还是不明白如果保证了 stdin 的 fd 值可以保证恒为 0, 你可以用它做什么, 如果不保证, 又不能做什么? 我实在想不出什么情景必须要让 stdin 的 fd 必须等于 0

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
69 [报告]
发表于 2013-02-07 22:40 |只看该作者
zylthinking 发表于 2013-02-07 22:24
要效果不具体, 还是不明白如果保证了 stdin 的 fd 值可以保证恒为 0, 你可以用它做什么, 如果不保证, ...

不明白就不明白吧,碰到那样的场合,你会恍然大悟的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
70 [报告]
发表于 2013-02-07 23:09 |只看该作者
问题是, 你自己确认你的思路没问题?

我大约感觉你是想将 stdin 输入重定向自某个文件, 但同时你又想也从一些命令行工具的输出中读入部分数据, 于是你就想一个办法让 stdin 既能从文本输入, 同时还能从其他程序标准输出读入?
你认为或许 stdin 的 fileno 保证是 STDIN_FILENO 就能做到了???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP