system(3) executes an external command. This is an example that the external command is a CUI application.

int ret;
ret = system("/path/to/shellscript.sh");

If system(3) is called from CUI application, standard output can be write to the terminal and standard input can be read from the terminal. But GTK+ applications (or any other typical GUI application) don't have the terminal.

For GTK+ application (without the terminal), the external command must be launch with terminal emulator.

Here is a simple example of launching /path/to/shellscript.sh with terminal emulator.

int ret;
ret = system("xterm -e /path/to/shellscript.sh");

It's simple. But hard-coding "xterm -e " is not smart.

Following example is depends on User's terminal emulator preference (e.g. Gnome Preferred Applications preference tool):

GAppInfo *appinfo = NULL;
gboolean ret = FALSE;

appinfo = g_app_info_create_from_commandline("/path/to/shellscript.sh",
                                             NULL,
                                             G_APP_INFO_CREATE_NEEDS_TERMINAL,
                                             NULL);
g_assert(appinfo != NULL); // TODO error handling is not implemented.

ret = g_app_info_launch(appinfo, NULL, NULL, NULL);
g_assert(ret == TRUE); // TODO error handling is not implemented.

Note that:

  • In this way, external application execute background. (system(3) function is foreground)
  • On my environment, following code does not work (segmentation fault at calling g_app_info_create_from_commandline()). GTK seems to be required.
#include <glib.h>
#include <gio/gio.h>
//#include <gtk/gtk.h>// !! HERE is required!

static const gchar *SCRIPT_PATH = "/path/to/shellscript.sh";

int main(int argc, char *argv[])
{
    GAppInfo *appinfo = NULL;
    gboolean ret = FALSE;

    //gtk_init(&argc, &argv);// !! HERE is required!

    appinfo = g_app_info_create_from_commandline(SCRIPT_PATH,
                                                 NULL,
                                                 G_APP_INFO_CREATE_NEEDS_TERMINAL,
                                                 NULL);
    g_assert(appinfo != NULL); // TODO error handling is not implemented.
    ret = g_app_info_launch(appinfo,
                            NULL,
                            NULL,
                            NULL);
    g_assert(ret == TRUE); // TODO error handling is not implemented.

    return 0;
}

See also