Try this kind of approach:
create a shell script like this (/tmp/filename is the example file name)
#!/bin/ksh
# test.sh
old="0"
while true
do
echo "`last_written /tmp/filename EXACTO $old`" | read old lines
if [ $old -lt 0 ] ; then
echo "Error opening file"
exit
fi
echo "$lines lines found `date +%c` "
sleep 5
done
compile this:
/******************************************************************
*
* last_written.c
* usage: last_written <filename> <search string> <last byte>
*
*
* output <total bytes searched> <total new lines with search string>
* assumes:
* searchstr occurs 0 or 1 times in a line only
* filename is a carriage control file
* prints -1 -1 to stdout on failure
*******************************************************************/
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
void usage(void)
{
fprintf(stdout,"-1 -1 \n");
fprintf(stderr," usage: last_written <filename> <search string> <last byte> \n");
exit(EXIT_FAILURE);
}
/* file close routine */
void closeit(int fd)
{
if (close(fd)== (-1))
{
fprintf(stdout,"-1 -1 \n");
perror("Error opening input file");
exit(EXIT_FAILURE);
}
}
/* count occurrences of searchstr in a buffer */
int find(char *buf, char *searchstr)
{
int result = 0;
char *p=NULL;
p=strstr(buf,searchstr);
while(p!=NULL)
{
result++;
p++;
p=strchr(p,'\n');
if(p!=NULL)
{
p=strstr(p,searchstr);
}
}
return result;
}
/* read nbytes from a file */
ssize_t readall(int fd, void *buf, size_t nbyte)
{
ssize_t nread = 0, n=0;
do
{
if ((n = read(fd, &((char *)buf)[nread], nbyte - nread)) == -1)
{
if (errno == EINTR)
{
continue;
}
else
{
return (-1);
}
}
if (n == 0)
{
return nread;
}
nread += n;
} while (nread < nbyte);
return nread;
}
int main(int argc, char *argv[])
{
int fd=0; /* file descriptor */
struct stat st; /* stat structure for file size */
char *p=NULL; /* pointer into the file */
char *buf=NULL; /* holds file */
ssize_t bytes=0; /* bytes read from the file */
long file_pos=0; /* starting offset into file */
long lines=0; /* number of new lines to search */
long result=0; /* number of lines with searchstr */
if(argc!=4) usage(); /* exit on bad parameters */
fd=open(argv[1],O_RDONLY);
if( fd< 0 || fstat(fd,&st) == (-1) )
{
fprintf(stdout,"-1 -1\n"); /* -1 is error */
perror("Error opening input file");
exit(EXIT_FAILURE);
}
if(st.st_size==atol(argv[3]) ) /* old file size == new file size */
{
fprintf(stdout,"%10s %10d\n", argv[3],0);
exit(EXIT_SUCCESS);
}
buf=malloc(st.st_size+ 1); /*create a buffer to hold the file */
if(buf==NULL)
{
fprintf(stdout,"-1 -1 \n");
perror("Error allocating memory");
exit(EXIT_FAILURE);
}
memset(buf,0x0,st.st_size+1);
bytes=readall(fd,buf,st.st_size);
if(bytes==(-1))
{
fprintf(stdout,"-1 -1 \n");
perror("Error reading file");
exit(EXIT_FAILURE);
}
/* start looking where we left off before */
p=buf;
p+=atol(argv[3]);
bytes=st.st_size;
if(*p)
{
result=find(p,argv[2]); /*count the number of lines with searchstr */
}
closeit(fd);
free(buf);
/* output <total bytes searched so far> <total new lines with search string> */
fprintf(stdout,"%10d %10d\n",bytes,result);
return 0;
}
into an executable image named last_written. I get this output from the script running a file stream writer in the background:
kcsdev:/home/jmcnama> lastw.sh
7 lines found Mon Jun 20 12:47:06 2005
2 lines found Mon Jun 20 12:47:11 2005
2 lines found Mon Jun 20 12:47:16 2005
1 lines found Mon Jun 20 12:47:21 2005
2 lines found Mon Jun 20 12:47:26 2005
1 lines found Mon Jun 20 12:47:31 2005
3 lines found Mon Jun 20 12:47:36 2005