免费注册 查看新帖 |

Chinaunix

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

关于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)

论坛徽章:
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
3 [报告]
发表于 2007-06-02 00:11 |只看该作者
原帖由 NewCore 于 2007-6-1 23:57 发表于 1楼  
问题是这样的:

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

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

fcntl(fd, F_SETFL, O_NONBLOCK);
mafd = fd + 1;
FD_SET(fd, &rfds);
/*... */
int ret =  ...

select 是为了那些可能会永远 block 的 I/O 操作准备的,而对普通文件的 I/O 操作不属于此类。具体参见 APUE2 相关章节。

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

论坛徽章:
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-02 00:25 |只看该作者
原帖由 NewCore 于 2007-6-2 00:24 发表于 4楼  
MMMIX 你好,那么我如何来做到文件的异步读写呢?写文件不是由我控制的,但是我需要在有数据的时候,把数据读出来,该如何处理呢?谢谢,我等待你的答复。

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

论坛徽章:
0
6 [报告]
发表于 2007-06-02 00:39 |只看该作者
原帖由 MMMIX 于 2007-6-2 00:25 发表于 5楼  

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


先谢谢你的关注。

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

论坛徽章:
0
7 [报告]
发表于 2007-06-02 10:05 |只看该作者
原帖由 NewCore 于 2007-6-2 00:39 发表于 6楼  


先谢谢你的关注。

原始问题是这样的:执行tar命令,然后把tar输出到标准输出的文件列表截获下来,作为我们自己的程序使用。最好的方式是管道和重定向,但是因为某种原因,这种方式不可行。不可行是因为我 ...



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

论坛徽章:
0
8 [报告]
发表于 2007-06-02 10:48 |只看该作者
原帖由 scutan 于 2007-6-2 10:05 发表于 7楼  



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


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

论坛徽章:
0
9 [报告]
发表于 2007-06-02 11:04 |只看该作者
原帖由 NewCore 于 2007-6-2 10:48 发表于 8楼  


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



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

论坛徽章:
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
10 [报告]
发表于 2007-06-02 11:21 |只看该作者
原帖由 NewCore 于 2007-6-2 00:39 发表于 6楼  


先谢谢你的关注。

原始问题是这样的:执行tar命令,然后把tar输出到标准输出的文件列表截获下来,作为我们自己的程序使用。最好的方式是管道和重定向,但是因为某种原因,这种方式不可行。不可行是因为我 ...

不要用 system,直接用 fork+exec 来执行 tar 命令,然后通过管道来传递数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP