免费注册 查看新帖 |

Chinaunix

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

关于select能否用于普通文件操作的疑问。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-01 23:57 |显示全部楼层 |倒序浏览
问题是这样的:

我想把普通文件的读写设置成异步模式的,

fd = open();
fd_set rfds;
int maxfd;

fcntl(fd, F_SETFL, O_NONBLOCK);
mafd = fd + 1;
FD_SET(fd, &rfds);
/*... */
int ret = selete(maxfd, NULL, &rfds, NULL, &tv)
{
if(FD_ISSET(fd, &rfds))
{
    /** ??? **/
}
}
我想通过这种方式来设置文件为异步读方式,如果有数据可读,就去读,否则就等待。但是现在是一直能有读时间触发,就是???号那个地方始终可以进入,没有阻塞
请问到底可不可以这样,或者我有哪个地方搞错了?谢谢,我晚上在线等回答...

论坛徽章:
0
2 [报告]
发表于 2007-06-02 00:08 |显示全部楼层
纠正一下笔误:
int ret = selete(maxfd, NULL, &rfds, NULL, &tv) ——————〉
int ret = selete(maxfd, &rfds, NULL, NULL, &tv)

论坛徽章:
0
3 [报告]
发表于 2007-06-02 00:24 |显示全部楼层
MMMIX 你好,那么我如何来做到文件的异步读写呢?写文件不是由我控制的,但是我需要在有数据的时候,把数据读出来,该如何处理呢?谢谢,我等待你的答复。

论坛徽章:
0
4 [报告]
发表于 2007-06-02 00:39 |显示全部楼层
原帖由 MMMIX 于 2007-6-2 00:25 发表于 5楼  

请给出更全面详细的问题描述。


先谢谢你的关注。

原始问题是这样的:执行tar命令,然后把tar输出到标准输出的文件列表截获下来,作为我们自己的程序使用。最好的方式是管道和重定向,但是因为某种原因,这种方式不可行。不可行是因为我们的系统里面执行system(...)的时候,命令的输出不是到标准输出的,至于输出到哪里,我也不清楚。(因为嵌入式系统里面,可能存在这样的问题吧。如果你知道,那谢谢告诉我)。那么所有,重定向的操作的方案就都不可行了。于是,我只有使用这样的方法,就是system("tar ... > file"),然后另外一个进城从file去读数据,但是什么时候有数据呢,不是我决定的,而是tar命令的执行来决定的,这就是比较详细地问题描述。我等候你的答复。

论坛徽章:
0
5 [报告]
发表于 2007-06-02 10:48 |显示全部楼层
原帖由 scutan 于 2007-6-2 10:05 发表于 7楼  



你的tar结束之后system()函数才会返回.
如果你想同时进行的话,就弄两个进程吧.


现在就是两个进程,一个进程执行system("tar"),另外一个进程去读文件,但是这种方式可行吗|?我测试的结果是什么都读不出来....

论坛徽章:
0
6 [报告]
发表于 2007-06-02 11:30 |显示全部楼层
原帖由 scutan 于 2007-6-2 11:04 发表于 9楼  



你看看你system()函数的返回值, 看其是否正确地执行了.
另外, 你在执行tar的时候, 注意你重定向的文件的路径的问题. 必要时写上绝对路径.


system执行是绝对没有问题的,因为解包后的文件已生成。
tar命令我就是用的绝对路径。

论坛徽章:
0
7 [报告]
发表于 2007-06-02 11:32 |显示全部楼层
原帖由 MMMIX 于 2007-6-2 11:21 发表于 10楼  

不要用 system,直接用 fork+exec 来执行 tar 命令,然后通过管道来传递数据。


我开始就是用得这样的标准揭发,但是因为我上面说的原因,system执行的结果没有到管道,所以才采用重定向到文件,再读文件的方法。
我马上用exec试一下。

论坛徽章:
0
8 [报告]
发表于 2007-06-02 11:33 |显示全部楼层
原帖由 MMMIX 于 2007-6-2 11:28 发表于 11楼  

可行的,但是在读文件的时候需要用 tail -f 命令。


c代码里面怎么用tail -f命令读文件?不明白.

论坛徽章:
0
9 [报告]
发表于 2007-06-02 12:12 |显示全部楼层
原帖由 MMMIX 于 2007-6-2 11:37 发表于 15楼  

呃……还得用重定向,又绕回去了

当然,你也可以自己实现和 tail -f 类似的功能,这个倒是可行。


我用execv和execvp试了下,问题一样,没有数据到管道...

我来看看tail -f怎么用,好不好实现。

有没有其他思路|?难道不能重定向到管道,这个还真变成impossible mission了....

论坛徽章:
0
10 [报告]
发表于 2007-06-02 21:09 |显示全部楼层
我谢大家的关注,我已解决了此问题。还是采用子进程system("tar > file"),父进程从文件读的方式,不过有些细节还需要特殊处理下。

to isnowran:
方法不错,我记下了,以后也许会有用到的时候。

to SuperZ:
谢谢你的回复,不过请看完前面的帖子再说,否则随便答复,你不觉得很不负责任吗?

anyway, 该问题暂时算告一段落。3ks all.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP