更改文件描述符以将 STDOUT 通过管道传输到套接字?

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

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

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

现在我有了服务器分支,然后使用 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/

相关文章:

c - 在 switch 语句中的 case 标签中声明相同的变量

c - 如何使用 C 中的 for 循环将数字列表写入文件?

c# - StreamWriter 不附加到文件,而是在不同的目录中创建一个新文件

java - 带有序列号的 UDP

Android 安全服务器客户端连接

Java Socket 服务器客户端代码卡住

c - Realloc pollfd - 转换为非标量

c - 热补丁填充始终是 16 的倍数吗?

C++:初始化在头文件中声明的模板构造函数/例程?

Java 文件 IO - 文件必须有空行才能被正确读取