[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