digitalmars.D.learn - Linux blocked on file read on exit, need select
- Darrell Gallion (23/23) Mar 20 2016 Program is blocked on exit, because of a blocking file read.
- cy (11/11) Mar 20 2016 I don't know, but you could always just use fcntl if you already
Program is blocked on exit, because of a blocking file read. I'd be glad to just kill it and exit. In this case I'm using dinotify, I exposed the fd. This issue is it's not working or blocked on exit. Never mind the constant monitor.add static immutable string stdoutFn="passFiles/vAppStdout"; void monitorStdout(){ auto monitor = iNotify(); Watch watch = monitor.add(stdoutFn.ptr, IN_ALL_EVENTS ); timeval timeout={tv_sec:0, tv_usec:500000 }; //int flags = fcntl(monitor.fd, F_GETFL, 0); //fcntl(monitor.fd, F_SETFL, flags | O_NONBLOCK); while(run){ fd_set fdset; FD_ZERO(&fdset); FD_SET(monitor.fd, &fdset); if(select(monitor.fd+1, &fdset, cast(fd_set*)null, cast(fd_set*)null, &timeout) ){ auto events = monitor.read(); watch = monitor.add(stdoutFn.ptr, IN_ALL_EVENTS ); } writeln("Exit monitor"); }
Mar 20 2016
I don't know, but you could always just use fcntl if you already can assume you're on Linux. extern (C) int fcntl(int, int, int); C keeps the constants under lock and key of course, so you have to specify them manually. But you could write a C program to print them out, or generate D code I suppose. const int F_SETFL = 4 const int F_GETFL = 3 const int O_NONBLOCK = 2048 fcntl(fd,F_SETFL,O_NONBLOCK | fcntl(fd,F_GETFL,42)); not tested or anything.
Mar 20 2016