я пытаюсь написать сокет, который загружает программы и перенаправляет сокет io на них. звучит очень похоже на inetd, но, насколько я знаю, inetd загружает программу, когда запрашивается ее порт. Я хочу, чтобы он загружался постоянно.
Все идет нормально. написать сервер сокетов не так сложно, но у меня не получилось работать с остальными. В основном я хочу открыть pipe(), 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;
}