特に、子プロセスを生成する関数を作成する必要があります。 私はこの機能にファイルディスクリプタのオプションのリストを渡したいので、ユーザーのニーズに応じて、子プロセスの入出力をリダイレクトすることができます。フォークされたプロセス出力をNULLにリダイレクト
私はこのようなややこの使用dup2
を行う方法について話して数十人を見てきました:
if(pid < 0) // error forking.
{
//...
}
else if(pid != 0) // Parent process.
{
ret = waitpid(pid, &status, 0);
return WEXITSTATUS(status);
}
else // Child process.
{
dup2(fd, STDIN_FILENO); // Clone passed file discriptor.
close(fd); // Close the passed one, since we have already cloned.
execvp(arglist[ 0 ], arglist);
}
よし。これはすべてインターネットにあります。 私の質問は今、どのように/dev/null
にリダイレクトするのですか(または何が最良の方法ですか)ですか?
ユーザーにopen(/dev/null)
を強制し、fd
として渡すか、それとも良い方法がありますか?
EDIT:
これは私が望んでいたほどきれいではありませんが、私は任意のより良い方法を見つけることができませんでしたので、私は、ユーザーがリダイレクトする可能性がどこにファイル名の配列を渡してしまいました、それぞれ、STDIN、STDOUTとSTDERR:それはいくつかのバグを持っているかもしれので、私はまだ完全には、それをテストしていません
static int do_exec(arglist_t arglist, const char *fio[ 3 ])
{
DEBUG__(OSU_DEBUG_LEVEL_1, "fio = %p\n", fio);
if (fio)
{
if (fio[ STDIN_FILENO ])
{
int fd = open(fio[ STDIN_FILENO ], O_RDONLY);
if (-1 < fd)
{
dup2(fd, STDIN_FILENO);
close(fd);
}
}
if (fio[ STDOUT_FILENO ])
{
int fd = open(fio[ STDOUT_FILENO ], O_WRONLY | O_CREAT | O_APPEND);
if (-1 < fd)
{
dup2(fd, STDOUT_FILENO);
close(fd);
}
}
if (fio[ STDERR_FILENO ])
{
int fd = open(fio[ STDERR_FILENO ], O_WRONLY | O_CREAT | O_APPEND);
if (-1 < fd)
{
dup2(fd, STDERR_FILENO);
close(fd);
}
}
}
return execvp(arglist[ 0 ], arglist);
}
- 。
@Zackと@gbulmerに本当に感謝します。
私はこれがうまくいくことは知っていますが、それを行うより良い方法があるのだろうかと思います。 @gbulmerのようなファイル名を以下に示すように使用して、文字列をNULLでテストし、私のAPIにオープンの責任感を持たせることができます。これはどんなファイルにも制限がなくても動作しますが、それはもっと良い方法でなければならないという味をまだ残しています。本当にありがとう! – j4x
「より良い方法」はあなたのように見えますか? – zwol
明示的にパラメータをテストしたり、ファイルを名前などで開く必要がないソリューションを見たいと思っていますが、それは不可能だと思うので、私はあきらめます。私はあなたが示唆していることをやります(私の編集を参照)。ありがとう! – j4x