我打开了一个套接字,它连接了一个客户端和服务器。
我正在实现远程执行,因此我想更改文件描述符表,以便通常进入stdout的调用实际上会通过套接字在客户端上输出。
现在我有服务器fork,然后使用system()命令执行任何命令。
操作文件描述符表需要做什么?
以下是我正在使用的代码:
我正在使用select。我使用的套接字是accept调用返回的套接字(这是所有服务器端)。
dup2(S,1);
int retval = fork();
if (retval > 1)
{
system(receive.text);
return 0;
}
现在的结果是,没有文本打印到服务器(因此它显然没有挂钩到服务器的stdout),但客户端上都没有显示任何内容。
我是否必须在客户端做更多的事情才能解决这个问题(比如一个recv()调用?),我使用的是正确的套接字吗?
感谢。
答案 0 :(得分:3)
通常的机制是dup2(2)
:
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
dup(2)
调用会将给定的文件描述符复制到编号最小的打开文件描述符。这是历史机制,仍然有效,但它不容易指定文件描述符号。因此引入dup2(2)
以允许指定两个文件描述符。
您可以像这样使用它:
int s = /* connect() or accept() */
int ret = dup2(s, 1);
/* exec() */
答案 1 :(得分:0)
问题是system
只保留父文件的描述符,所以它不能像你想要的那样工作。您可以使用popen
,但这很难看。你真的应该自己编写fork
和exec
代码。 system
几乎总是一个错误。