Jonathan M Davis wrote:
Okay, I'm looking to be able to run an external program from within my D program. The library functions for this appear to be in std.process. You have system() and various versions of execv(). system() makes a call in shell. execv() executes the program without a shell.

What I'd _like_ to be able to do is run the program without a shell so that I don't have to worry about escaping special characters in file names, and I want to have access to the output from the program. This poses two problems.

1. Is there a way to run a program without the shell and without the call terminating the program (per bugzilla 3158, execv takes over your program and terminates it when it's done, in spite of what the documentation says - it's certainly been killing my programs when I've tried)? The only way that I see to do that at the moment is to spawn a separate thread and run execv in it. I'd prefer to just make the call and wait for it to return. Is there a way to do so?

2. Is there a way to get at what the called program sends to stdout? I'm afraid that I don't have a clue how to get at that.

Any help would be appreciated. Thanks.

- Jonathan M Davis


std.process has an undocumented function spawnvp(), which I believe does the same as the C function _spawnvp(), i.e. it forks and executes a child process, optionally waiting for it to finish. The signature is:

  int spawnvp(int mode, string pathname, string[] argv);

where 'mode' is one of P_WAIT or P_NOWAIT. You can use this, but be aware that there is most likely a reason for it being undocumented. :)


When the new concurrency framework is in place, I assume this will improve. To begin with, the D developers are focusing on multithreading with message passing, such as:

  auto threadID = spawn(&threadFunction);
  threadID.send(message);

But they have said that this will be extended to multiprocess message passing, and then I almost expect something like this:

  auto procID = spawnProcess("firefox");
  procID.send(message);

It's some time into the future, though. ;)

-Lars

Reply via email to