免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2007-06-05 09:34 |只看该作者
各位,我按照昨天的提示,打开文件时设置同步标志,然后加上了缓冲设置,如下:

void * bk_thread(void *)
{
    int fd;
    FILE * fp;
    char linebuf[BUFLEN + 1];

    fd = open("a.out", O_CREAT | O_RDWR | O_SYNC);   /* a.out 作为保存输出信息的文件, */

/*************设置为行缓冲*******************/   
    fp = fdopen(fd, "w+");
    setvbuf(fp, linebuf, _IOLBF, BUFLEN);
/*****************************************/   
    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                        /* 处理读出来的数据 */
        {
        }      
    }   
}

现在还是读不出来数据啊?

论坛徽章:
0
12 [报告]
发表于 2007-06-05 12:41 |只看该作者
实在是叙述的糟糕,能否再清楚的描述一下你

想要怎么样

论坛徽章:
0
13 [报告]
发表于 2007-06-05 12:42 |只看该作者
所有的缓冲如果不起作用,那么肯定是因为你并没有改变tar,也许tar是有缓冲的。
不知道为什么要这么干。

论坛徽章:
0
14 [报告]
发表于 2007-06-05 12:44 |只看该作者
搂住,我没有别的意思,我只是希望你能描述的清楚一点。

论坛徽章:
0
15 [报告]
发表于 2007-06-05 12:46 |只看该作者
我首先把stdout重定向到了一个文件a.out, 然后一个子进程执行system("tar > stdout"),把数据写到文件a.out中,同时,主进程read文件a.out,把命令执行结果读出来

fp = popen("tar ..","r");
tar应该也不至于让你等太久呀。

论坛徽章:
0
16 [报告]
发表于 2007-06-05 13:14 |只看该作者
原帖由 flw2 于 2007-6-5 12:44 发表于 14楼  
搂住,我没有别的意思,我只是希望你能描述的清楚一点。


好,我再详细说说。我要解开一个tar包,同时把tar命令执行的输出(即知道解包后的文件名列表)截取下来,现在我用的办法是首先把标准输出重定向到文件a.out,然后一个子进程system("tar")到标准输出,实际上是到了a.out,然后主进程在从文件a.out中读出文件列表,即tar命令的输出。

本来应该是很简单的一个事情,但是现在问题在于:子进程在执行system的时候,不时如同我们平时在shell下执行tar时那样,一边解包,一边把输出到文件,而是把书出缓存起来(我估计是这样) ,直到tar执行完了,才把输出一起写到文件a.out中,但是,这是不满足我的需求的.我需要及时知道当前解包到那个文件了,说白了,我需要对当前正在解包的文件的名字作其他处理.

上面就是这个的代码实现,而我现在就是不知道如何解决我上面说的问题,我尝试了很多办法,都没有效果,希望你能给我点提示?谢谢!

论坛徽章:
0
17 [报告]
发表于 2007-06-05 13:16 |只看该作者
原帖由 flw2 于 2007-6-5 12:46 发表于 15楼  
我首先把stdout重定向到了一个文件a.out, 然后一个子进程执行system("tar > stdout"),把数据写到文件a.out中,同时,主进程read文件a.out,把命令执行结果读出来

fp = popen("tar ..",& ...


我们的系统是经过裁减的嵌入式系统,popen已经被裁掉了,我有苦难言!

论坛徽章:
0
18 [报告]
发表于 2007-06-05 13:37 |只看该作者
原帖由 flw2 于 2007-6-5 12:42 发表于 13楼  
所有的缓冲如果不起作用,那么肯定是因为你并没有改变tar,也许tar是有缓冲的。
不知道为什么要这么干。


奇怪的是,如果tar命令自己有缓冲,在shell里直接执行tar命令的时候,也不是说解包完了,才在屏幕上显示出来,而是一边解包,一边执行的.

论坛徽章:
0
19 [报告]
发表于 2007-06-06 00:37 |只看该作者
没人了吗?其实,我也觉得这个问题确实是相当的诡异...

我已作了最坏打算,下了tar的源码,准备把它编到自己的代码里面...铁了心要把它搞定。

论坛徽章:
0
20 [报告]
发表于 2007-06-06 08:07 |只看该作者
这个任务用 shell 写不好吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP