2014-02-12 110 views
0

我正在编写两个程序(一个客户端,一个服务器),它们通过UNIX套接字相互通信。这个想法是,客户端发送一个命令到服务器,如ls -l,服务器创建一个子项(fork()),子项名为execlp(...,command,...)execlp的输出放在客户端的终端窗口中。C,UNIX。通过UNIX套接字发送execlp的输出

但是,现在,我发送给服务器的命令的输出写入服务器的终端窗口,而不是客户端。有没有办法从execlp获取输出并通过套接字send(..,string,...)发送给客户端?

我想坚持使用套接字,而不是管道(我发现所有类似的问题都有建议管道的答案)。

回答

2

上一个答案是错误的;出于某种原因,我的思想固定在管道上。正如Jonathan Leffler在评论中指出的那样,您可以更优雅地实现这一目标。

  • 当一个新的连接出现,fork上等待
  • 孩子一个新的子继承父插座和父进程关闭它
  • 孩子替换使用套接字的文件描述符:

    dup2(sockfd, STDIN_FILENO); /* Check the return value for these. */ 
    dup2(sockfd, STDOUT_FILENO); 
    dup2(sockfd, STDERR_FILENO); 
    
  • 孩子execvp S中的新方案,为客户端请求

+0

是否有理由不绑定孩子'ls',以便其标准输出(和标准错误)进入套接字? –

+0

@JonathanLeffler你能澄清一下吗? – cnicutar

+0

我希望服务器通过接受连接来处理流程,并在父母继续收听时分派子女来管理请求。孩子会修正来自套接字的标准输入,将标准输出和标准错误修改到套接字,然后可以简单地'execvp()'请求的进程。当客户端与服务器位于不同的计算机上时,这将起作用,而管道绝对不会跨越计算机。一些细节可供讨论,但总体论题是“使套接字进入标准I/O流并运行程序”。 –