Child thread blocks main thread

Regan Heath regan at netwin.co.nz
Sun Sep 10 14:54:48 PDT 2006


Hi,

I haven't looked at your code below, but I thought you might find another  
example of the same thing useful, so, attached is a little process/pipe  
library I wrote.

Regan

On Sun, 10 Sep 2006 18:12:54 +0200, Jona Joachim <jaj13 at web.de> wrote:
> Hi!
> I have a problem concerning threads.
>
> What I want to do is redirect the output of a shell command to a text
> widget.
>
> Here is my approach:
> - create a thread that connects stdout to a named pipe an calls system()
> to run the command. The output of the command is then redirected to the
> pipe.
> - create another thread that reads the pipe an writes the output to the
> text widget.
> - the main thread keeps running so that the application doesn't block and
> offers the ability to cancel the subprocesses.
>
> The problem is that writing to a pipe is blocking until the pipe gets
> read. I thought that the write thread would get blocked until the read
> thread reads the pipe but instead the entire program blocks until the  
> pipe
> is read. Why doesn't the main thread continue to run when the write  
> thread
> blocks?
>
> Here is my code:
>
> import std.stdio;
> import std.thread;
>
> extern(C) int dup(int);
> extern(C) int dup2(int, int);
> extern (C) int mkfifo(char*, int);
> extern(C) int system(char*);
> extern(C) int close(int);
>
> class writeToFifo : Thread
> {
>   private:
>     char[] _cmd;
>     int _stdout_old;
>     fpos_t _pos;
>
>   public:
>     this(char[] command, char[] pipe)
>     {
>       _cmd = command;
>
>       fflush(stdout);
>       fgetpos(stdout, &_pos);
>       _stdout_old = dup(fileno(stdout));
>
>       mkfifo(pipe, 0600);
>       stdout = freopen(pipe, "w", stdout);
>
>       super();
>     }
>
>     ~this()
>     {
>       fflush(stdout);
>       dup2(_stdout_old, fileno(stdout));
>       close(_stdout_old);
>       clearerr(stdout);
>       fsetpos(stdout, &_pos);        /* for C9X */
>     }
>
>     int run()
>     {
>       system(_cmd);
>       return 0;
>     }
> }
>
> class readFromFifo : Thread
> {
>   private:
>     _iobuf* _pipe;
>  public:
>     this(char[] pipe)
>     {
>       _pipe = fopen(pipe, "r");
>
>       super();
>     }
>
>     ~this()
>     {
>       fclose(_pipe);
>     }
>
>     int run()
>     {
>       char buffer;
>
>       while(!feof(_pipe) && !ferror(_pipe))
>       {
>         fprintf(stderr, "%s", fgetc(_pipe));
>       }
>
>       return 0;
>     }
> }
>
> int main(char[][] argv)
> {
>   writeToFifo writeT = new writeToFifo("ls -l", "/tmp/foopipe");
>   writeT.start(); /* this blocks so the rest is never executed */
>  readFromFifo readT = new readFromFifo("/tmp/foopipe");
>   readT.start();
>
>   writeT.wait();
>  return 0;
> }
>
>
> Best regards,
> Jona

-------------- next part --------------
A non-text attachment was scrubbed...
Name: process.zip
Type: application/zip
Size: 7268 bytes
Desc: not available
Url : http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20060911/7143f6e3/attachment.zip 


More information about the Digitalmars-d-learn mailing list