【发布时间】:2012-11-08 07:22:18
【问题描述】:
我尝试编写一个套接字来加载程序并将套接字 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;
}
【问题讨论】:
-
我只是想看看结果。 >/tmp/test.txt 应该在 /tmp 中创建了一个文件,但它没有。