這是「man select」的代碼示例以及幾行讀取正在寫入的實際文件的代碼示例。我懷疑當./myfile.txt
被寫入時,select
會返回,它現在可以從該fd讀取。但是會發生什麼,只要txt文件存在,select會不斷在while循環中返回。我希望它只在新數據寫入文件末尾時纔會返回。我認爲這是它應該如何工作。select()如何等待常規文件描述符(非套接字)?
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval;
int fd_file = open("/home/myfile.txt", O_RDONLY);
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
FD_SET(fd_file, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
while (1)
{
retval = select(fd_file+1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */
if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n");
}
exit(EXIT_SUCCESS);
}
那麼你的問題是什麼? **誰說'select'只能在套接字上工作**? – cnicutar 2012-08-10 12:45:05
編輯的問題。對於混淆抱歉。 – glutz 2012-08-10 12:49:44
'select'可以在_any_文件類型描述符上使用,不管它是套接字,文件還是管道還是任何類似的描述符。然而,你不能用它來監視一個文件的寫入時間,因爲你必須使用一些特定的操作系統,比如你可以在Linux上使用[inotify](http://en.wikipedia.org/wiki/Inotify )。 – 2012-08-10 12:51:49