免费注册 查看新帖 |

Chinaunix

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

[C] 关于重定向标准输出到管道写端的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-29 15:18 |只看该作者 |倒序浏览
在同一个进程中,想把标准输出重定向到管道的写端,然后从管道的读端读出来。
重定向是这么做的:
dup2(fd[1], STDOUT_FILENO); fd[1]是使用pipe取到的两个句柄之一。

现在的问题是:
如果使用write函数直接向STDOUT_FILENO写数据,马上就可以从管道的读端读到数据;
如果使用printf输出数据,必须的在后边加上fflush(stdout),才能从管道的读端读到数据。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2013-05-29 15:26 |只看该作者
输出内容后加  \n 试试

论坛徽章:
0
3 [报告]
发表于 2013-05-29 15:31 |只看该作者
加了\n的。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2013-05-29 15:37 |只看该作者
那用 setvbuf 之类的禁用缓存

论坛徽章:
0
5 [报告]
发表于 2013-05-29 15:52 |只看该作者
我这么做的目的主要原因是:程序打算修改为一个守护进程,然后程序中使用了一些别的库,这些库的输出我是无法要求的,所以想重定向标准输出后,从管道的另一端取到数据,然后通过进程间消息传给前台进程。

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
6 [报告]
发表于 2013-05-29 15:58 |只看该作者
缓冲了,按专家说的禁用缓冲试过了?

论坛徽章:
0
7 [报告]
发表于 2013-05-29 16:24 |只看该作者
使用setvbuf(stdout, NULL, _IONBF, 0);设置为无缓冲后,可以及时收到数据了。
但printf输出字符时,如果不加\n,还是无法及时收到。

和使用setlinebuf设置的效果是一样的。

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
8 [报告]
发表于 2013-05-29 17:05 |只看该作者
avcodec 发表于 2013-05-29 16:24
使用setvbuf(stdout, NULL, _IONBF, 0);设置为无缓冲后,可以及时收到数据了。
但printf输出字符时,如果不 ...

标准输入输出默认行缓冲,如果重定向到文件则变为全缓冲。
你这变行缓冲了?继续跟踪下了么?建议弄的更清楚俺也涨点知识。

论坛徽章:
0
9 [报告]
发表于 2013-05-29 19:12 |只看该作者
使用dup2把标准输出重定向到管道的写端。实际上是关闭了标准输出,让标准输出的文件描述符指向了pipe返回的文件描述符。这时候,应该不是标准输出的行为,而是fd[1]的行为。

还是没有找到原因。还在寻找中。

论坛徽章:
0
10 [报告]
发表于 2013-05-31 11:40 |只看该作者
在程序一启动的时候就关闭了所有的文件句柄,包括0,1,2。
然后重定向标准输出以后,一执行printf,就会让程序崩溃。难道是printf内部调用的是FILE之类的指针,因为没有这样的指针,而导致崩溃吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP