[LinuxPPS] select() on /dev/pps

Xavier Bestel xavier.bestel at free.fr
Thu Jul 30 09:39:27 CEST 2015


Hi,

for an application of mine I would need to be able to wait for events on 
a char device and on a PPS device; on the char device the select() call 
is the obvious candidate, but it doesn't seem to work on the PPS device. 
That is, select() always returns immediately telling some data is 
available, and a PPS_FETCH either returns immediately if flags=0 or 
waits for 1s if flags=PPS_TIME_INVALID;

That looks wrong to me. IMHO select() should wait for 1s and PPS_FETCH 
should "consume" the data without waiting.
If it should work, could you tell me where is my code wrong ?

Thanks,

     Xav


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

int main(int argc, char *argv[])
{
	if(argc != 2) {
		fprintf(stderr, "usage: %s device\n", argv[0]);
		exit(1);
	}
	int fd = open(argv[1], O_RDWR);
	if(fd < 0) {
		fprintf(stderr, "error opening %s: %m\n", argv[1]);
		exit(1);
	}
	fd_set set;
	while(1) {
		struct timeval tv;
		tv.tv_sec = 2;
		tv.tv_usec = 0;
		FD_ZERO(&set);
		FD_SET(fd, &set);
		int sel = select(fd + 1, &set, NULL, NULL, &tv);
		printf("select returns %d\n", sel);
		if(FD_ISSET(fd, &set)) {
			struct pps_fdata fdata;
			fdata.timeout.sec = 0;
			fdata.timeout.nsec = 0;
			fdata.timeout.flags = PPS_TIME_INVALID; // or 0
			if(ioctl(fd, PPS_FETCH, &fdata) < 0) {
				fprintf(stderr, "no PPS : %m");
				exit(1);
			}
			printf("fetch returns\n");
		}
         }
	return 0;
}




More information about the discussions mailing list