7#include <grass/spawn.h>
12#define pipe(fds) _pipe(fds, 4096, O_BINARY | O_NOINHERIT)
15static FILE *do_popen(
struct Popen *state,
int wr,
const char *program,
18 int which = wr ? 0 : 1;
19 const char *dir = wr ?
"w" :
"r";
27 if (pipe(pipe_fds) < 0)
30 cfd = pipe_fds[wr ? 0 : 1];
31 pfd = pipe_fds[wr ? 1 : 0];
40 G_spawn_ex(program, SF_ARGVEC, args, SF_REDIRECT_DESCRIPTOR, which, cfd,
41 SF_CLOSE_DESCRIPTOR, pfd, SF_BACKGROUND,
NULL);
43 if (state->pid == -1) {
51 state->fp = fdopen(pfd, dir);
62FILE *
G_popen_write(
struct Popen *state,
const char *program,
const char **args)
64 return do_popen(state, 1, program, args);
67FILE *
G_popen_read(
struct Popen *state,
const char *program,
const char **args)
69 return do_popen(state, 0, program, args);
void G_popen_close(struct Popen *state)
void G_popen_clear(struct Popen *state)
FILE * G_popen_read(struct Popen *state, const char *program, const char **args)
FILE * G_popen_write(struct Popen *state, const char *program, const char **args)
int G_spawn_ex(const char *command,...)
Spawn new process based on command.