1

system/popen - 移植可能ですが、シェルを使用します - 1 つの文字列引数

pipe+fork+dup2+exec - コードが多くなり、移植性が低下しますが、配列を指定できます。

真ん中にシンプルなものはありますか?次のようなものを期待しています:

const char* args = {"/usr/bin/myprogram", "myprogram", "--option", NULL};
FILE* outfile = popen_read_end_args(args);
fscanf(outfile, "...");
fclose(outfile);

配列を使用して外部プログラムを呼び出し、C でその出力を読み取る最良の方法は何ですか? これのための膨張していないラッパーはありますか?

4

2 に答える 2

2

そのようなラッパーを自分で実装しました: https://github.com/vi/udpserv/blob/master/popen_arr.c

ヘッダーファイルは次のとおりです。

/**
* For and exec the program, enabling stdio access to stdin and stdout of the program
* You may close opened streams with fclose.
* Note: the procedure does no signal handling except of signal(SIGPIPE, SIG_IGN);
* You should waitpid for the returned PID to collect the zombie or use signal(SIGCHLD, SIG_IGN);
*
* @arg in stdin of the program, to be written to. If NULL then not redirected
* @arg out stdout of the program, to be read from. If NULL then not redirected
* @arg program full path of the program, without reference to $PATH
* @arg argv NULL terminated array of strings, program arguments (includiong program name)
* @arg envp NULL terminated array of environment variables, NULL => preserve environment
* @return PID of the program or -1 if failed
*/
int popen2_arr (FILE** in, FILE** out, const char* program, const char* argv[], const char* envp[]);

/** like popen2_arr, but uses execvp/execvpe instead of execve/execv, so looks up $PATH */
int popen2_arr_p(FILE** in, FILE** out, const char* program, const char* argv[], const char* envp[]);

/**
* Simplified interface to popen2_arr.
* You may close the returned stream with fclose.
* Note: the procedure does no signal handling except of signal(SIGPIPE, SIG_IGN);
* You should wait(2) after closing the descriptor to collect zombie process or use signal(SIGCHLD, SIG_IGN)
*
* @arg program program name, can rely on $PATH
* @arg argv program arguments, NULL-terminated const char* array
* @arg pipe_into_program 1 to be like popen(...,"w"), 0 to be like popen(...,"r")
* @return FILE* instance or NULL if error
*/
FILE* popen_arr(const char* program, const char* argv[], int pipe_into_program);
于 2013-09-08T21:49:24.473 に答える
1

いいえ、ありません。ISO C では、 を使用する以外に新しいプロセスを開始する方法はありませんsystemsystemPOSIX には、、popenおよびfork(+ vforkPOSIX.2008 より前)以外にプロセスを開始する方法がありません。

于 2013-09-08T14:50:19.733 に答える