Re: select() problem/feature

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Nikola wrote:
Hi all,

i am writing small daemon.....and when i was seeing the end ......that was just the beginning
of my problems.

General idea was to monitor list of files that was given on start.

For this example i am using test1.txt and test2.txt because I've succeeded to replicate my problem
,at least i think so....:)))))

so the files are....

test1.txt
-----8<-----8<-----8<-----8<-----8<-----8<-----8<
Testing from test1
-----8<-----8<-----8<-----8<-----8<-----8<-----8<



test2.txt
-----8<-----8<-----8<-----8<-----8<-----8<-----8<
Testing from test1
-----8<-----8<-----8<-----8<-----8<-----8<-----8<

and daemon.c


Now the problem is following:

when i compile (gcc daemon.c => a.out) and run binary in this version all works fine....and
if I do
#echo "some new line" >> test1.txt

i would see on my screen that select figured it out and i am having new data for processing and it
would print it out.

but when i uncomment last fprintf my while and select goes ballistic.....it prints numbers forever...not
blocking......

So why is that this line "fprintf(stderr,"%d\n",i++);" causes this behavior.

tnx for help.


------------------------------------------------------------------------

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {

 	FILE *fp1,*fp2;
	fd_set fdst;
	char buffer[100];
	int i;
	
	
	if((fp1 = fopen("test1.txt","r")) == NULL){
		return 0;
	}
	
	if((fp2 = fopen("test2.txt","r")) == NULL){
		return 0;
	}
	
	
	
        /* Daemon-specific initialization goes here */

        /* The Big Loop */
        while (1) {
           /* Do some task here ... */

		FD_ZERO(&fdst);
		FD_SET(fileno(fp1),&fdst);
		FD_SET(fileno(fp2),&fdst);

		select(fileno(fp2)+1,&fdst,NULL,NULL,NULL);

		
		if(FD_ISSET(fileno(fp1),&fdst)){

			while(fgets(buffer,100,fp1) != NULL){
				puts(buffer);

			}	
		}
		

		if(FD_ISSET(fileno(fp2),&fdst)){
			
			while(fgets(buffer,100,fp2) != NULL){
				puts(buffer);
			}	
	
		}

		//fprintf(stderr,"%d\n",i++);
	
        }
	
	exit(EXIT_SUCCESS);
}



------------------------------------------------------------------------



1st: you can not use select on fd-s opened on regular files; use aio for
async. I/O;

2nd: leave the comment on. check the CPU - if I'm not mistaking, the
while(1){} goes nuts with or without fprintf();

M.D.


--
This message was scanned for spam and viruses by BitDefender.
For more information please visit http://www.bitdefender.com/

-
: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux