diff options
author | Robin Gareus <robin@gareus.org> | 2014-03-13 16:50:44 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-03-13 16:58:07 +0100 |
commit | 543099afbafe83a0bb334f2a016c0d849fe2ca47 (patch) | |
tree | 21798ed902efe449dd329c556280fb5247a9be91 /libs/vfork/README | |
parent | f48b5568883468e70a751ec1aa934e5a55bb7705 (diff) |
rework SystemExec - use vfork wrapper (and lots of related stuff)
Diffstat (limited to 'libs/vfork/README')
-rw-r--r-- | libs/vfork/README | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/libs/vfork/README b/libs/vfork/README new file mode 100644 index 0000000000..fb591a6984 --- /dev/null +++ b/libs/vfork/README @@ -0,0 +1,44 @@ +vfork-exec-wrapper +================== + +A tiny tool that redirects stdio file-descriptors and executes a program. + +Motivation +---------- + +Ardour can start external helper applications for various purposes +(e.g. video-server, video-monitor, plugin-scanner, post-export scripts,...) +and has the need to bidirectionally communicate with the external app. + +On POSIX platforms (OSX, GNU/Linux, BSD,..) launching an external app is a +combination of fork() and execve(2). The problem with that is that fork(2) +duplicates the complete page-table (incl. allocated locked memory, and +file-descriptors) which - even if fork(2) is done from a non-realtime +thread - may cause audio I/O glitches or worse out-of-memory errors if +the mlock(2) limit is reached. + +vfork(2) on the other hand "is a special case of clone(2). It is used to +create new processes without copying the page tables of the parent process. +It may be useful in performance-sensitive applications where a child is +created which then immediately issues an execve(2)." [vfork man page]. + +The problem with vfork(2) is that file-descriptors are not cloned, which +makes bi-directional communication impossible without additional work. +This is exactly what this vfork-exec-wrapper does: It takes a list of +file-descriptors, re-directs them to stdio and calls execve(2) again. + +This code was previously in pbd/system_exec.cc (done after fork(2), +which become a NOOP with vfork(2)). + +Usage +----- + +ardour-exec-wrapper <file-des> <mode> <nice> <command> [args] + +ardour-exec-wrapper takes three pairs of file-descriptors, stderr mode, +nice-level followed by the command to execute and optional arguments. + +The first set FDs is used to communicate failure back to the parent process. +They are closed if execve(2) succeeds. The following two FDs are stdin and +stdout. The mode specifies handling of stderr: 0: keep stderr, 1: close and +ignore, 2: merge stderr into stdout. |