gtk3 and fork/exec of non-gtk child
- From: rbd <rbd soest hawaii edu>
- To: gtk-app-devel-list gnome org
- Subject: gtk3 and fork/exec of non-gtk child
- Date: Fri, 13 Jan 2017 15:30:26 -1000 (HST)
Hi all,
I have a few questions relating to the use of fork/exec within a gtk3
program. Briefly, (i) can this be made to work at all, and (ii) should I
perform any specific operations related to disconnecting from gtk within
the child process code of my gtk parent in the very brief interval between
the fork() and the exec()? Following are details of my situation which I
believe is extremely simple, and I want to use the very simplest working
solution.
I am porting someone else's old X11/Motif process management GUI to gtk3.
It makes extensive use of fork/exec and a SIGCHLD signal handler (which
waitpid(.. WNOHANG)s on terminated children) to manage somewhere between 5
and 20 or so child processes. These children do NOT have any GUI and are
background data logging processes which read serial and/or network data
sources and write reformatted output to serial, network and/or disk
destinations. The management GUI is a simple tabular display with one row
per child that shows whether each child is running or not and has a
clickable button allowing the operator to start/stop/restart that
particular child. The manager needs to remain running for time periods as
long as 3 months.
Porting this to gtk3 seemed trivial until I started reading these archives
yesterday and encountered numerous warnings about using fork/exec with
gtk. It's unclear whether or not they apply to me since my child processes
will have absolutely no GUI of any kind (not gtk, X11 or anything else)
either related to or even completely independent of the gtk GUI running in
the manager process. Opinion about this does not seem to be uniform: some
people say that fork/exec works just fine if you have a simple scenario,
others give dire warnings and recommend more complicated systems of forks
within threads, use of various glib spawn/task functions, etc. I do not
want to (i) expend more effort than is truly needed, or (ii) unnecessarily
burden the code with complexity specific to the needs of gtk/glib that
will all have to be unraveled and redone ten years from now when the
inevitable next-generation API displaces gtk. (No offense intended, but
I've seen this movie a few times. ;-> )
Following is the existing fork-to-exec segment of the child code in the
X11/Motif manager. Only a couple things of interest take place here: (i)
an Xt input handler process registered at program startup via
XtAppAddInput() which was periodically reading some non-X11 file
descriptor is deregistered, and (ii) a bunch of other non-stdio file
descriptors are closed (presumably including the X11 display socket). The
latter was written as a brute force loop that just tries to close
everything in sight whether it might have been open or not, even though
the manager seems to be opening only a couple of other file descriptors
outside of X11.
pid= fork();
if (pid == 0) {
XtRemoveInput(xtinputid);
for (i= 3; i < 20; i++)
(void) close(i);
execlp("yada", "yada", "yada", 0);
exit(-1);
}
Given that I want the gtk/gdk/etc. library code running within my parent
manager process to remain ignorant of all children and continue operating
as if there were none, my more particular questions with regard to this
child process code are:
(1) Do I need to deregister the gtk input handler that I will be
substituting for the old Xt input handler?
(2) Do I need to explicitly call any kind of gtk shutdown or main loop
exit function or should I very clearly avoid doing so?
(3) Should I do the same kind of brute force file descriptor closedown as
the original code? Analogously to X11, I have to think this would close at
least one gtk-opened decriptor, which might be something that I should
definitely either do or NOT do.
(4) I read one archive reference that said children should always use
_exit() rather than exit() in this context. Is that true, and if so does
that apply only to the cleanup after a failed execlp() in this fragment or
should it be done for all exit instances within the child's own source
code as well? This processing system includes dozens of child process
programs and doing the latter would be a real pain (and perhaps have other
unwanted consequences for the child).
My gut instinct is that given that the exec() will give the child process
an essentially clean slate EXCEPT for inheritance of open descriptors, I
probably do want to close all non-stdio descriptors one way or another
prior to the exec -- the essential question is how to do this in a way
that causes no impact whatsoever to the gtk ennvironment of the manager
parent.
Thanks!
Roger Davis
Univ. of Hawaii
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]