[GRASS5] R_open_driver() after fork()

Glynn Clements glynn.clements at virgin.net
Thu Feb 13 14:58:59 EST 2003


Radim Blazek wrote:

> > With the patch, R_open_driver() shouldn't hang indefinitely in
> > sync_driver(); you should get a warning after 5 seconds then failure
> > after a further 10 seconds (15 seconds total). Basically, the second
> > R_open_driver() call should eventually fail, rather than blocking
> > indefinitely.
> >
> > If SIGALRM fails to interrupt the read() call even with the patch,
> > then your OS kernel is broken.
> 
> Yes, I have got:
> Warning - no response from graphics monitor <x0>.
> Check to see if the mouse is still active.
> ERROR - no response from graphics monitor <x0>.
> Monitor <x0>: Caught SIGPIPE

OK; the patch works as intended, then.

In which case, should this be changed for 5.0.x? I'm not sure that it
should. While it does technically fix a bug, it's a bug that shouldn't
be triggered in normal use; the situation (where a client tries to
connect to a monitor while it is in use by another client) shouldn't
happen.

> > Presumably the child calls one of the exec*() functions shortly after
> > the fork()? 
> 
> Yes.
> 
> > In which case, we should probably set the close-on-exec
> > flag on monitor connections:
> >
> > 	flags = fcntl(_wfd, F_GETFD);
> > 	flags |= FD_CLOEXEC;
> > 	fcntl(_wfd, F_SETFD, flags);
> >
> > This will force the descriptor to be closed automatically upon
> > exec*().
> 
> OK. Could you do that as xdriver expert?

Well, it's a libraster issue rather than anything to do with the
monitors themselves.

As for implementation, again: should this go into 5.0.x?

> > More generally, fork() and high-level APIs don't mix.
> 
> Yes, I see, it is old story - better framework for GUI.

I wasn't referring to GRASS APIs in particular; many third-party
libraries have highly "undefined" behaviour w.r.t. fork().

-- 
Glynn Clements <glynn.clements at virgin.net>




More information about the grass-dev mailing list