プログラムをロードしてソケットioをこれらにリダイレクトするソケットを作成しようとしています。inetd のように聞こえますが、私が知る限り、inetd はポートが要求されたときにプログラムをロードします。永久にロードしたい。
ここまでは順調ですね。ソケットサーバーを書くのはそれほど難しいことではありませんが、残りはうまくいきませんでした。私は基本的にパイプ()、dup2()を開き、それをstdinとstdout、およびexecv()プログラムに開きたいと思っています。
問題は、呼び出されたプログラムが入力を取得しないことです。テスト プログラムで表示してみます。誰か教えてください、何が悪いのですか?
int create_program_fork(int *ios, char const *program) {
// create pipes to program
if (pipe(ios) != 0) {
return -1;
}
// fork to new process
int f = fork();
if (f < 0) {
// fork didn't work
close(ios[0]);
close(ios[1]);
return(-1);
}
if (f > 0) {
// master hasn't much to do here
return f;
}
// *** Child Process
// close std** file descriptors
printf ("executing program");
close(STDIN_FILENO);
close(STDOUT_FILENO);
// duplicate pipes as std**
dup2(ios[0], STDIN_FILENO);
dup2(ios[1], STDOUT_FILENO);
// close pipes
close(ios[0]);
close(ios[1]);
// call program
return execvp(program, NULL );
}
int main(int argc, char *argv[]) {
int ios[2];
// call program
int pid = create_program_fork(ios, "/bin/bash");
if (0 != pid){
exit(EXIT_FAILURE);
}
char const exit_order[] = "exit\0";
char const order[] = ">/tmp/test.txt\0";
// do something
write(ios[1], order, strlen(order));
// bash should stop then..
write(ios[1], exit_order, strlen(exit_order));
return 0;
}