我创建了一个以下程序,我希望在程序中打开我正在打开的文件的文件描述符。
#define FILE "help"
int main()
{
int ret1;
struct pollfd fds[1];
ret1 = open(FILE, O_CREAT);
fds[0].fd = ret1;
fds[0].events = POLLIN;
while(1)
{
poll(fds,1,-1);
if (fds[0].revents & POLLIN)
printf("POLLING");
}
return 0;
}
它将进入无限循环。我希望在文件发生某些操作时运行循环。 (它是一个ASCII文件) 请帮忙
答案 0 :(得分:4)
poll()
实际上对打开的文件无效。由于文件上的read()
永远不会阻止,poll()
将始终返回,您可以从文件中读取非阻塞。
这将(几乎)对字符设备*,命名管道**或套接字起作用,因为当没有数据可用时,read()
会阻止它们。 (你还需要实际读取那些数据,否则民意调查会一次又一次地说明数据是否可用)
要“轮询”正在增长/缩小的文件,请参阅man inotify
或在循环中使用fstat()
实施您自己的投票。
*块设备是一个分开的故事;从技术上讲,从硬盘读取可以阻止10毫秒或更长时间,这不会被视为阻止Linux中的I / O.
**另见how to flush a named pipe using bash
答案 1 :(得分:1)
不知道这是否是您的问题的原因(可能不是),但重新定义标准宏FILE
是一个特别糟糕的主意。
你的编译器没有抱怨这个吗?