我打开了一个套接字,它连接客户端和服务器。
我正在实现远程执行,因此我想更改文件描述符表,以便通常会转到标准输出的调用实际上会穿过套接字在客户端上输出。
现在我有了服务器分支,然后使用 system() 命令来执行任何命令。
我需要做什么来操作文件描述符表?
这是我正在使用的代码:
我正在使用选择。我正在使用的套接字是由接受调用返回的套接字(这都是服务器端)。
dup2(S,1);
int retval = fork();
if (retval > 1)
{
system(receive.text);
return 0;
}
现在的结果是,没有文本打印到服务器(因此它显然没有连接到服务器的标准输出),但客户端上也没有显示任何内容)。
我是否需要在客户端做更多的事情才能得到这个结果(比如recv()调用?),我使用的是正确的套接字吗?
谢谢。
最佳答案
通常的机制是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() */
关于更改文件描述符以将 STDOUT 通过管道传输到套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533720/