免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9018 | 回复: 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
25 [报告]
发表于 2007-06-04 17:43 |只看该作者
to zhugcx,不能用popen!!! 你以为我不想用啊,哎,我有苦难言.

各位,我现在遇到了新的问题,请继续跟踪帖子http://linux.chinaunix.net/bbs/v ... &extra=page%3D1

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
24 [报告]
发表于 2007-06-04 12:29 |只看该作者
怎么不用popen ,,我很奇怪哦

论坛徽章:
0
23 [报告]
发表于 2007-06-02 23:23 |只看该作者
如果select能用于普通文件,那么它应该就成为U_SelEct

论坛徽章:
0
22 [报告]
发表于 2007-06-02 23:22 |只看该作者
select的作用是对不能立马读到的fd设置超时,而你需要的是监控文件又没有变化。
select对普通文件根本不会超时。

论坛徽章:
0
21 [报告]
发表于 2007-06-02 23:16 |只看该作者
linux
google inotify

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

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

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

anyway, 该问题暂时算告一段落。3ks all.

论坛徽章:
0
19 [报告]
发表于 2007-06-02 20:24 |只看该作者
请重定向到命名管道,而不是普通文件。

论坛徽章:
0
18 [报告]
发表于 2007-06-02 16:28 |只看该作者
类似tail -f,有新数据就读,否则等待
有很多情况没有判断,演示而已

  1. int main()
  2. {
  3.         int fd = open( "hello", O_RDWR |  O_CREAT, 0755 );
  4.         char buf[4096] = {};
  5.         int filesize = 0;
  6.         struct stat st;
  7.         while( 1 )
  8.         {
  9.                 fstat( fd, &st );
  10.                 if( st.st_size > filesize )
  11.                 {
  12.                         filesize = st.st_size;
  13.                         bzero( buf, sizeof( buf ) );
  14.                         int retval = read( fd, buf, sizeof( buf ) - 1 );
  15.                         printf( "%s\n", buf );
  16.                 }
  17.                 else
  18.                 {
  19.                         printf( "no new data\n" );
  20.                         sleep( 1 );
  21.                 }
  22.         }

  23.         return 0;
  24. }
复制代码

[ 本帖最后由 isnowran 于 2007-6-2 16:30 编辑 ]

论坛徽章:
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
17 [报告]
发表于 2007-06-02 13:25 |只看该作者
原帖由 NewCore 于 2007-6-2 12:12 发表于 16楼  


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

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

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

呃,我觉得你应该检查下其他的方面,例如说 tar 有没有输出,你是不是错把标准错误当作标准输出了等等。再不然就把你不能工作的代码精简成一个完整的例子贴上来。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP