Prashant
Prashant

Reputation: 1

GTK application hangs when created a child process

I am creating a GTK application in C. I am creating a child process using fork and then replacing it with execve("crawler",arg,env); which crawls my home directory and stores all the filenames in a file. Now, this child process takes some time (about 2-5 minutes). In the mean time, when this child process is running, the main GTK parent program is waiting. But when the child process is running, after some time, the GTK application hangs.

I have tried gdk_thread_enter()/leave() in my main function. But still I am the application is hanging.

Please, point out a mistake if any or else suggest any modification.

Upvotes: 0

Views: 825

Answers (2)

James Waldby - jwpat7
James Waldby - jwpat7

Reputation: 8711

If what you mean by "when this child process is running, the main GTK parent program is waiting" is that your code executes a wait(), waitid(), waitpid() in its main thread, then the app will indeed suspend execution until a child terminates (unless you've selected NOHANG option).

If your Gtk app doesn't need to coordinate further with your crawler program, just use the previously-mentioned g_spawn_command_line_async routine, and do not set G_SPAWN_DO_NOT_REAP_CHILD. If you do need to coordinate, you could set that flag, and create a GChildWatch source, or perhaps could use one of the g_spawn pipe routines.

As I interpret gdk_thread_enter()/leave(), they are locking or unlocking threading, rather than running or stopping new threads. Gtk callbacks run in the main thread, so as indicated above, a blocking waitpid() in a callback will hang the Gtk app. A non-blocking waitpid() in a timer callback (eg) is not a problem, however.

Upvotes: 1

michel-lind
michel-lind

Reputation: 9766

execve does not create a child process, it replaces the current process with the child. Are you sure you used fork() first, and then execve() from within the child?

EDIT since you're already using fork/execve, perhaps the child process is still interacting with Gtk somehow. Best to use Glib/Gtk+-specific functions for invoking the crawler -- try, for instance, g_spawn_command_line_async

Upvotes: 1

Related Questions