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