KProcess overhaul
Oswald Buddenhagen
ossi at kde.org
Mon Sep 26 19:13:42 BST 2005
moin waldo, martijn, *,
as indicated in kdelibs/TODO, i'm planning some major rework of kprocess
for kde4.
1) anybody who tried redirecting a KProcess' i/o somewhere certainly
noticed that it is clumsy: either you have to override the *comm*
virtuals or you have to use setUseShell(true) to let the shell do the
redirection - or both. this is inconvenient and additionally sort of a
nightmare for the windows folks (right?). proposed api additions:
enum Direction { DefaultForFD, ReadOnly, WriteOnly, ReadWrite };
enum StdFDs { StdInFD = 0, StdOutFD = 1, StdErrFD = 2 };
// for open fds in the *parent* (this) process.
// this is the most generic one and works even on windows (at least for
// the first three handles without problems). in principle, everything
// else is only a convenience function.
KProcess::redirect( int handle, int sourceHandle, bool closeInParent = true );
// for files
KProcess::redirect( int handle, const QString& filename, Direction mode = DefaultForFD );
// piping processes is slightly more tricky. first variant:
KProcess::redirect( int handle, KProcess *drain, int drainHandle, bool bidirectional = false );
// however, the definition that this-> is the source is quite arbitrary.
// also, it is not clear how to control the pipe as a whole.
// so the second variant is a KProcessPipe class. simplest variant to
// build a pipe:
KProcessPipe::append( KProcess *process );
// the stdouts would be just piped into the followers' stdins.
// however, more complex structures might be possible, like chatting or
// piping each of stdout and stderr into another process:
KProcessPipe::add( KProcess *srcProcess, int srcHandle, KProcess *dstPprocess, int dstHandle, bool bidirectional = false );
// the pipe object keeps track of all involved processes. it offers a
// KProcess-like api that allows controlling them as if they were one
// process.
// adding KShell::buildPipeFromArgs() would make the setUseShell(true)
// case mostly superfluous even for user-entered commands.
strictly speaking, the current communication stuff in kprocess is a
special case of redirection as well. so it might make sense to transfer
all the i/o-related functionality into kprocio (and make the buffering
optional; it needs some rework anyway).
taking things to the extreme (that is, to the point where the common
case might become slightly inconvenient), one could introduce a
KProcessEndpoint class whose instances would be attached to particular
KProcesses to obtain the current std* stuff.
the opposite direction is merging KProcIO into KProcess to make it a
fully-integrated everything.
another possibility to consider is making KProcess (or the new KProcIO)
a multiplexed QIODevice, like QProcess is. not sure it is worth the
overhead, though - one can open a QFile with the process' fd at any
time. of course, having an integrated multiplexer reduces the number of
IODevice objects one has to manage at a given time.
of course i'm interested in martijn's input on how this all fits his
KExtProcess stuff, but from what i've seen it is mostly orthogonal.
a question to the windows folks: should i make the pre-/post-fork()
virtuals x11-only? afaik, fork() still needs to be emulated and is
horribly slow on windows, and i can't see how one could use fork() only
if needed (that is, if the virtuals are actually overridden).
2) multi-threading. currently all signals go into the event loop thread.
this sucks. not sure who should get them, though - the thread in which
the KProcess was created or the one it was started in?
3) well, nothing that needs discussion; see the TODO file. the prototype
will be open for discussion. :)
--
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!
--
Chaos, panic, and disorder - my work here is done.
More information about the kde-core-devel
mailing list