免费注册 查看新帖 |

Chinaunix

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

各位,有了新的问题,再次麻烦大家give me a hand [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-04 17:42 |只看该作者 |倒序浏览
这里是http://linux.chinaunix.net/bbs/thread-899878-1-1.html的续贴,现在遇到了新的问题

问题如下: 我首先把stdout重定向到了一个文件a.out, 然后一个子进程执行system("tar > stdout"),把数据写到文件a.out中,同时,主进程read文件a.out,把命令执行结果读出来,现在我发现system命令执行时把输出先缓存起来了,所以导致我在主进程中不能及时读到数据,而只有等到system命令执行完了,系统才把数据从缓存中写到文件a.out.

请问用什么办法,使system即使把输出写到文件a.out,而不是得等到它执行完|???

如果有人说为什么用这个办法,而不用...,请参考帖子http://linux.chinaunix.net/bbs/thread-899878-1-1.html,

我也是没有办法之举!!!现在只求解决问题.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2007-06-04 18:14 |只看该作者
原帖由 NewCore 于 2007-6-4 17:42 发表于 1楼  
这里是http://linux.chinaunix.net/bbs/thread-899878-1-1.html的续贴,现在遇到了新的问题

问题如下: 我首先把stdout重定向到了一个文件a.out, 然后一个子进程执行system("tar > stdout"),把数 ...

我一直很好奇你为什么不用 fork+exec 而坚持要用 system ?用 fork+exec 的话许多东西都是你可以控制的,但用 system 则否。

论坛徽章:
0
3 [报告]
发表于 2007-06-04 18:24 |只看该作者
to MMMIX

谢谢回复!

嗯,我记得在第一个帖子里,你就让我用exec代替system,我也是这样尝试了,但是没有解决问题啊!

我现在也可以用exec代替system,只是我想请问一下,是否用exec就可以把输出重定向到文件,且是及时把结果写到文件,而不是等到命令结束返回?

其实,我还用pthread + system的方式尝试过,主线程create子线程而不是子进程(我怀疑过是fork + system的问题),但是问题还是一样,system就是不及时写文件,而是等到命令返回才写文件。

我已经快黔驴技穷了,找到了问题所在,却不知道该如何解决。。。希望能给我一些好办法和思路。

论坛徽章:
0
4 [报告]
发表于 2007-06-04 18:27 |只看该作者
我先回家了,我会及时关注各位的回复,谢谢!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2007-06-04 19:03 |只看该作者
原帖由 NewCore 于 2007-6-4 18:24 发表于 3楼  
to MMMIX

谢谢回复!

嗯,我记得在第一个帖子里,你就让我用exec代替system,我也是这样尝试了,但是没有解决问题啊!

我现在也可以用exec代替system,只是我想请问一下,是否用exec就可以把输出重定向到文件,且是及时把结果写到文件,而不是等到命令结束返回?

当然可以,适当的设置缓冲模式就行了。甚至你还可以在打开文件的时候指定同步标志,或者在写完文件的时候手工刷新。

论坛徽章:
0
6 [报告]
发表于 2007-06-04 19:34 |只看该作者
设置缓冲模式
行缓冲或者无缓冲

论坛徽章:
0
7 [报告]
发表于 2007-06-04 21:48 |只看该作者
原帖由 MMMIX 于 2007-6-4 19:03 发表于 5楼  

当然可以,适当的设置缓冲模式就行了。甚至你还可以在打开文件的时候指定同步标志,或者在写完文件的时候手工刷新。



大哥,你又给了我一线希望,请问你说得“适当设置缓冲模式”能不能具体点?

“甚至你还可以在打开文件的时候指定同步标志,或者在写完文件的时候手工刷新。”能不能具体点,同时我也在网上查一下。

现在在家了,没环境,明天到公司我再试看,请继续跟踪,谢谢!

论坛徽章:
0
8 [报告]
发表于 2007-06-04 21:49 |只看该作者
原帖由 anhongkui 于 2007-6-4 19:34 发表于 6楼  
设置缓冲模式
行缓冲或者无缓冲


谢谢,我查下资料,如果不麻烦的话,能不能再详细点?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2007-06-04 22:03 |只看该作者
原帖由 NewCore 于 2007-6-4 21:48 发表于 7楼  



大哥,你又给了我一线希望,请问你说得“适当设置缓冲模式”能不能具体点?

“甚至你还可以在打开文件的时候指定同步标志,或者在写完文件的时候手工刷新。”能不能具体点,同时我也在网上查一下。

...

强烈建议 APUE2。

论坛徽章:
0
10 [报告]
发表于 2007-06-04 22:51 |只看该作者
为了便于解决问题,我在这里还是把关键代码列一下,代码在公司,我只能大概给出个思路了:

void * bk_thread(void *)
{
    int fd;
   
    fd = open("a.out", O_CREAT | O_RDWR);   /* a.out 作为保存输出信息的文件 */
   
    dup2(fd, 1)

    if(0 == fork())
    {
        system("tar ... >&1");        /* 故意加 >&1 到输出,实际上到a.out文件 */
        exit(1);
    }
   
    int fd_dup;
    int count;

    fd_dup = dup(fd);    /* 后面用fd_dup来操作 */

    while((count = read()) >= 0)         /* 这里count一直=0,除非system()返回,那个时候数据才被写道文件a.out中 */
    {
        if(count == 0)                /* 数据为0,判断子进城是否结束,结束就退出,没结束sleep一下后继续去读 */
        {
            
        }
        else                        /* 处理读出来的数据 */
        {
        }      
    }   
}

int main()
{

    pthread_t tid;

    /* do something */

    pthread_create(bk_thread);
    pthread_join(&tid, NULL);
}

我大概思路就是这样了,我初步定为应该是缓冲的问题,请看看是吗?

to MMMIX, 我查下有问题在问吧。上面应该是这个问题导致的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP