原帖由 NewCore 于 2007-6-4 17:42 发表于 1楼
这里是http://linux.chinaunix.net/bbs/thread-899878-1-1.html的续贴,现在遇到了新的问题
问题如下: 我首先把stdout重定向到了一个文件a.out, 然后一个子进程执行system("tar > stdout"),把数 ...
原帖由 NewCore 于 2007-6-4 18:24 发表于 3楼
to MMMIX
谢谢回复!
嗯,我记得在第一个帖子里,你就让我用exec代替system,我也是这样尝试了,但是没有解决问题啊!
我现在也可以用exec代替system,只是我想请问一下,是否用exec就可以把输出重定向到文件,且是及时把结果写到文件,而不是等到命令结束返回?
原帖由 MMMIX 于 2007-6-4 19:03 发表于 5楼
当然可以,适当的设置缓冲模式就行了。甚至你还可以在打开文件的时候指定同步标志,或者在写完文件的时候手工刷新。
原帖由 anhongkui 于 2007-6-4 19:34 发表于 6楼
设置缓冲模式
行缓冲或者无缓冲
原帖由 NewCore 于 2007-6-4 21:48 发表于 7楼
大哥,你又给了我一线希望,请问你说得“适当设置缓冲模式”能不能具体点?
“甚至你还可以在打开文件的时候指定同步标志,或者在写完文件的时候手工刷新。”能不能具体点,同时我也在网上查一下。
...
原帖由 flw2 于 2007-6-5 12:44 发表于 14楼
搂住,我没有别的意思,我只是希望你能描述的清楚一点。
原帖由 flw2 于 2007-6-5 12:46 发表于 15楼
我首先把stdout重定向到了一个文件a.out, 然后一个子进程执行system("tar > stdout"),把数据写到文件a.out中,同时,主进程read文件a.out,把命令执行结果读出来
fp = popen("tar ..",& ...
原帖由 flw2 于 2007-6-5 12:42 发表于 13楼
所有的缓冲如果不起作用,那么肯定是因为你并没有改变tar,也许tar是有缓冲的。
不知道为什么要这么干。
原帖由 langue 于 2007-6-6 08:07 发表于 20楼
这个任务用 shell 写不好吗?
原帖由 mirnshi 于 2007-6-6 09:53 发表于 21楼
最简单的就是popen,如果有可能,可以自己摘抄一个popen。如果只能选择system,而且>转向不灵的,是不是可以采用|管道,经由另一个你自己编写的程序读取stdin,然后通过unix-socket之类的传给主控程序。文件 ...
原帖由 NewCore 于 2007-6-6 11:06 发表于 23楼
研究tar代码中,支持自己裁减
我准备把gzip解压裁掉,然后在代码里面自己用gzip解压,保留tar的解包功能,得到解包后的文件名就OK了,还在实验中.
现在比较郁闷的是,这段代码有些extern的函数,先尝试一下 ...
原帖由 flw2 于 2007-6-6 13:21 发表于 25楼
tar的输出是什么?我觉得tar就是输出一个目录树。
所以你要什么呢?目录树的结构(名字而不是内容)?
原帖由 flw2 于 2007-6-6 13:21 发表于 25楼
tar的输出是什么?我觉得tar就是输出一个目录树。
所以你要什么呢?目录树的结构(名字而不是内容)?
原帖由 NewCore 于 2007-6-6 13:33 发表于 26楼
我要内容. 现在的问题是,我得不到.
原帖由 flw2 于 2007-6-6 14:31 发表于 29楼
tar会mkdir,你想得到dir名称还是什么?
可能是因为不了解tar,我真还不明白你要什么,我试图努力看懂你说的,但是还是不明白。
你可以写个函数声明,我可以看看我会不会实现这个函数。
原帖由 flw2 于 2007-6-6 14:31 发表于 29楼
tar会mkdir,你想得到dir名称还是什么?
可能是因为不了解tar,我真还不明白你要什么,我试图努力看懂你说的,但是还是不明白。
你可以写个函数声明,我可以看看我会不会实现这个函数。
原帖由 flw2 于 2007-6-6 15:12 发表于 32楼
呵呵,别用这么严重的词,我明白你的意思了,你就是要文件名,但是却不想完之后在出来,确实很奇怪。
你现在的问题是tar的输出并没有在文件出来的同时打印出来对吗?
原帖由 flw2 于 2007-6-6 15:25 发表于 36楼
我知道了,通常tar是行缓冲的,但是当你定向到文件a.out的时候成为全缓冲了。
原帖由 flw2 于 2007-6-6 15:27 发表于 37楼
定向到管道也没有用。如果你非要立马取结果,那么我现在暂时有两种办法
1.伪终端
2.该tar的代码
1不需要改代码,但是需要稍微折腾一下。
2很简单
原帖由 flw2 于 2007-6-6 15:28 发表于 38楼
楼主
你的条件,不能等待是很严格吗?要不结束之后再遍历一下多简单
原帖由 flw2 于 2007-6-6 15:37 发表于 42楼
很好办,它确实是到输出,直接
main开头,setbuf(stdout,NULL);
原帖由 NewCore 于 2007-6-6 15:40 发表于 44楼
这个我试过了阿,本贴中,我贴出来的代码就做过这样的尝试啊....
原帖由 flw2 于 2007-6-6 15:43 发表于 46楼
老大,这个要在tar的main函数中,
原帖由 flw2 于 2007-6-6 15:44 发表于 47楼
我有源码,这些不都是公开的吗。busybox里的tar也有个main函数呀,你在关键地方检察一下,比如
if (argv == "tar")
setbuf NULL
原帖由 flw2 于 2007-6-6 15:54 发表于 52楼
放在tar_main不一定可以,如果以前没有printf确实可以
你要是很自由的改代码,直接main函数前面加个setbuf也没有什么关系
不过个人认为你的做法实在是不可取
原帖由 NewCore 于 2007-6-6 16:00 发表于 53楼
这作为最后的办法把,我现在还是先把tar搞到我自己的代码里,这样应该是现在比较合适的解决办法了.
多谢你的回复,遇上这样的问题,郁闷死我了,都说蛮简单个事,我做了一个星期了....
原帖由 MMMIX 于 2007-6-6 16:16 发表于 54楼
因为你一直坚持要用 system 函数。
原帖由 NewCore 于 2007-6-6 16:19 发表于 55楼
老大说的是,我承认我可能是有点转牛角尖了,但是system并不是问题的关键吧...
原帖由 mirnshi 于 2007-6-6 19:25 发表于 57楼
用unix-socket,测试了一下,可以得到输出。
server: 打开socket, system执行客户端,等待客户端的输入
client: 打开socket,建立连接,然后复制到0,1,2句柄上,再exec执行tar,服务端就可以读到tar的输出了。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |