* SECTION:gsubprocess
* @title: GSubprocess
* @short_description: Child processes
+ * @include: gio/gio.h
* @see_also: #GSubprocessLauncher
*
* #GSubprocess allows the creation of and interaction with child
* comprehensive API for asynchronous I/O, such
* g_output_stream_splice_async(). This makes GSubprocess
* significantly more powerful and flexible than equivalent APIs in
- * some other languages such as the <literal>subprocess.py</literal>
+ * some other languages such as the `subprocess.py`
* included with Python. For example, using #GSubprocess one could
* create two child processes, reading standard output from the first,
* processing it, and writing to the input stream of the second, all
* without blocking the main loop.
*
* A powerful g_subprocess_communicate() API is provided similar to the
- * <literal>communicate()</literal> method of
- * <literal>subprocess.py</literal>. This enables very easy interaction
- * with a subprocess that has been opened with pipes.
+ * `communicate()` method of `subprocess.py`. This enables very easy
+ * interaction with a subprocess that has been opened with pipes.
*
* #GSubprocess defaults to tight control over the file descriptors open
* in the child process, avoiding dangling-fd issues that are caused by
* change of working directory, child setup functions, etc).
*
* A typical use of #GSubprocess will involve calling
- * g_subprocess_new(), followed by g_subprocess_wait() or
- * g_subprocess_wait_sync(). After the process exits, the status can be
+ * g_subprocess_new(), followed by g_subprocess_wait_async() or
+ * g_subprocess_wait(). After the process exits, the status can be
* checked using functions such as g_subprocess_get_if_exited() (which
* are similar to the familiar WIFEXITED-style POSIX macros).
*
g_clear_object (&self->stderr_pipe);
g_strfreev (self->argv);
+ g_mutex_clear (&self->pending_waits_lock);
+
G_OBJECT_CLASS (g_subprocess_parent_class)->finalize (object);
}
static void
g_subprocess_init (GSubprocess *self)
{
+ g_mutex_init (&self->pending_waits_lock);
}
static void
* g_subprocess_new: (skip)
* @flags: flags that define the behaviour of the subprocess
* @error: (allow-none): return location for an error, or %NULL
- * @argv0: first commandline argument to pass to the subprocess,
- * followed by more arguments, followed by %NULL
+ * @argv0: first commandline argument to pass to the subprocess
+ * @...: more commandline arguments, followed by %NULL
*
* Create a new process with the given flags and varargs argument
* list. By default, matching the g_spawn_async() defaults, the
while ((arg = va_arg (ap, const gchar *)))
g_ptr_array_add (args, (gchar *) arg);
g_ptr_array_add (args, NULL);
+ va_end (ap);
result = g_subprocess_newv ((const gchar * const *) args->pdata, flags, error);
/**
* g_subprocess_newv:
- * @argv: commandline arguments for the subprocess
+ * @argv: (array zero-terminated=1) (element-type utf8): commandline arguments for the subprocess
* @flags: flags that define the behaviour of the subprocess
* @error: (allow-none): return location for an error, or %NULL
*
* g_subprocess_get_identifier:
* @subprocess: a #GSubprocess
*
- * On UNIX, returns the process ID as a decimal string. On Windows,
- * returns the result of GetProcessId() also as a string.
+ * On UNIX, returns the process ID as a decimal string.
+ * On Windows, returns the result of GetProcessId() also as a string.
*/
const gchar *
g_subprocess_get_identifier (GSubprocess *subprocess)
* The process must have been created with
* %G_SUBPROCESS_FLAGS_STDIN_PIPE.
*
- * Returns: the stdout pipe
+ * Returns: (transfer none): the stdout pipe
*
* Since: 2.40
**/
* The process must have been created with
* %G_SUBPROCESS_FLAGS_STDOUT_PIPE.
*
- * Returns: the stdout pipe
+ * Returns: (transfer none): the stdout pipe
*
* Since: 2.40
**/
* The process must have been created with
* %G_SUBPROCESS_FLAGS_STDERR_PIPE.
*
- * Returns: the stderr pipe
+ * Returns: (transfer none): the stderr pipe
*
* Since: 2.40
**/
* This function does not fail in the case of the subprocess having
* abnormal termination. See g_subprocess_wait_check() for that.
*
+ * Cancelling @cancellable doesn't kill the subprocess. Call
+ * g_subprocess_force_exit() if it is desirable.
+ *
* Returns: %TRUE on success, %FALSE if @cancellable was cancelled
*
* Since: 2.40
source == state->stdout_buf ||
source == state->stderr_buf)
{
- if (!g_output_stream_splice_finish ((GOutputStream*)source, result, &error))
+ if (g_output_stream_splice_finish ((GOutputStream*) source, result, &error) == -1)
goto out;
if (source == state->stdout_buf ||
* @callback: Callback
* @user_data: User data
*
- * Asynchronous version of g_subprocess_communicate_utf(). Complete
+ * Asynchronous version of g_subprocess_communicate_utf8(). Complete
* invocation with g_subprocess_communicate_utf8_finish().
*/
void