更改文件描述符以将STDOUT管道连接到套接字?

时间:2011-04-04 01:22:07

标签: c file-io client-server file-descriptor

我打开了一个套接字,它连接了一个客户端和服务器。

我正在实现远程执行,因此我想更改文件描述符表,以便通常进入stdout的调用实际上会通过套接字在客户端上输出。

现在我有服务器fork,然后使用system()命令执行任何命令。

操作文件描述符表需要做什么?

以下是我正在使用的代码:

我正在使用select。我使用的套接字是accept调用返回的套接字(这是所有服务器端)。

            dup2(S,1);

            int retval = fork();
            if (retval > 1)
            {
            system(receive.text);
            return 0;
            }

现在的结果是,没有文本打印到服务器(因此它显然没有挂钩到服务器的stdout),但客户端上都没有显示任何内容。

我是否必须在客户端做更多的事情才能解决这个问题(比如一个recv()调用?),我使用的是正确的套接字吗?

感谢。

2 个答案:

答案 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,但这很难看。你真的应该自己编写forkexec代码。 system几乎总是一个错误。