C 将文件描述符更改为管道标准输出到套接字?

C 将文件描述符更改为管道标准输出到套接字?,c,file-io,client-server,file-descriptor,C,File Io,Client Server,File Descriptor,我打开了一个连接客户端和服务器的套接字 我正在实现远程执行,所以我想更改文件描述符表,这样通常会转到stdout的调用实际上会通过套接字在客户端上输出 现在我有了服务器fork,然后使用system()命令执行任何命令 我必须做什么来操作文件描述符表 以下是我正在使用的代码: 我正在使用select。我使用的套接字是accept调用返回的套接字(这都是服务器端的) 这样做的结果是,没有文本被打印到服务器上(因此它显然没有连接到服务器的stdout中),但是客户端上也没有显示任何内容) 我是否还需

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

我正在实现远程执行,所以我想更改文件描述符表,这样通常会转到stdout的调用实际上会通过套接字在客户端上输出

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

我必须做什么来操作文件描述符表

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

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

这样做的结果是,没有文本被打印到服务器上(因此它显然没有连接到服务器的stdout中),但是客户端上也没有显示任何内容)

我是否还需要在客户端做更多的事情才能将其导出(比如recv()调用?),我是否使用了正确的套接字


谢谢

通常的机制是
dup2(2)


问题是
system
只保留了父级的文件描述符,因此它不能像您希望的那样工作。你可以用popen,但它很难看。您确实应该自己编写
fork
exec
代码<代码>系统几乎总是一个错误。

@blackbinary,你让我后悔只使用了整数而不是
STDOUT\u FILENO
:)-
0
是stdin,
1
是STDOUT,
2
是stderr;由于shell重定向的
2>&1
风格,我发现它更容易记住——您几乎从不重定向
0
,因此必须输入。:)好的,然后我看到的页面有一个输入错误(0而不是1)。我将在原始帖子中发布一些代码,因为它的行为仍然不正确。@Blackbinary,该页面可能还需要标准输入来为命令工作。啊,我认为它是等效的,我只是在节省时间。因此,如果我自己fork和exec,它应该可以工作?那么,如果使用dup2来更改文件描述符,为什么我不能使用printf(因为它现在将指向套接字)?它不起作用,但我想知道为什么(而且我似乎也不能用fork和exec的方式工作)。
            dup2(S,1);

            int retval = fork();
            if (retval > 1)
            {
            system(receive.text);
            return 0;
            }
#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);
int s = /* connect() or accept() */
int ret = dup2(s, 1);
/* exec() */