免费注册 查看新帖 |

Chinaunix

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

[算法] 越是看似简单的问题越是要命——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
21 [报告]
发表于 2013-02-06 22:54 |只看该作者
cjaizss 发表于 2013-02-06 22:05
我猜测这个似乎有问题的吧,可能行为未定义.
但没证据.

freopen(stdin)只是重建stdin,但并不保证fileno(stdin)==STDIN_FILENO。
典型的例子是:
fclose(stdout);
open("test.txt", O_CREAT|O_RDWR, 0600);
freopen(stdout);
system("ls");
看看ls的结果是输出到tty上还是输出到test.txt文件里。
Linux的ls强制输出到STDOUT_FILENO,而不是stdout!

论坛徽章:
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
22 [报告]
发表于 2013-02-06 23:07 来自手机 |只看该作者
fdopen 不行?
fclose(stdin)
fd = open("/dev/stdin", O_RDONLY);
dup2(fd, STDIN_FILENO)
FILE* in = fdopen(STDIN_FILENO, "rb");
stdin = in;
printf("%d\n", fileno(stdin));

我就不信不行。 说到底村夫似乎没搞明白里面的概念

论坛徽章:
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
23 [报告]
发表于 2013-02-06 23:09 |只看该作者
本帖最后由 一介村夫 于 2013-02-06 23:09 编辑
zylthinking 发表于 2013-02-06 23:07
fdopen 不行?
fclose(stdin)
fd = open("/dev/stdin", O_RDONLY);

一开始就说了,stdin不一定能作为左值,Linux允许,但是HP-UX不允许。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
24 [报告]
发表于 2013-02-06 23:13 |只看该作者
我已经不知道是什么了.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
25 [报告]
发表于 2013-02-06 23:14 |只看该作者
本帖最后由 cjaizss 于 2013-02-06 23:16 编辑

好像根据标准,stdin关了之后就没法再打开吧
freopen好像是唯一手段.

论坛徽章:
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
26 [报告]
发表于 2013-02-06 23:16 |只看该作者
本帖最后由 一介村夫 于 2013-02-06 23:17 编辑
cjaizss 发表于 2013-02-06 23:14
好像根据标准,stdin关了之后就没法再打开吧

freopen就是为了重新打开stdin这类文件而设计的,但是它不保证reopen之后的fileno与原来相同。
如果stdin的地址可写,那么fdopen是更好的方法,Windows/DOS就是这样做的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
27 [报告]
发表于 2013-02-06 23:18 |只看该作者
一介村夫 发表于 2013-02-06 23:16
freopen就是为了重新打开stdin这类文件而设计的,但是它不保证reopen之后的fileno与原来相同。

保证不了也没办法......
直接dup2过去我不知道标准I/O里有没有限制

论坛徽章:
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
28 [报告]
发表于 2013-02-06 23:20 |只看该作者
cjaizss 发表于 2013-02-06 23:18
保证不了也没办法......
直接dup2过去我不知道标准I/O里有没有限制

dup2是没用的,它只是让两个值指向同一个文件,但是并不能改变fileno(stdin)。
看我21楼的例子就明白了。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
29 [报告]
发表于 2013-02-06 23:22 |只看该作者
一介村夫 发表于 2013-02-06 23:20
dup2是没用的,它只是让两个值指向同一个文件,但是并不能改变fileno(stdin)。
看我21楼的例子就明白了。 ...

freopen不能先把文件关了

论坛徽章:
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
30 [报告]
发表于 2013-02-06 23:23 来自手机 |只看该作者
那好, 再写,
将fdopen 换成 freopen("/dev/stdin", "rb", stdin), 不保证 fileno 相同, 但至少stdin 一定和以前一样, 要一定一样?不是左值? 不是左值抗得住memcpy 不?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP