C、 UNIX。通过UNIX套接字从execlp发送输出

C、 UNIX。通过UNIX套接字从execlp发送输出,c,sockets,unix,output,C,Sockets,Unix,Output,我正在用C编写两个程序(一个客户端,一个服务器),它们通过UNIX套接字相互通信。其思想是,客户端向服务器发送一个命令,如ls-l,服务器创建一个子(fork()),子对象执行execlp(…,command,…),来自execlp的输出被放入客户端的终端窗口 但是,正如现在一样,我发送到服务器的命令的输出被写入服务器的终端窗口,而不是客户端的终端窗口。是否有方法从execlp获取输出,并通过带有send(…,string,…)的套接字将其发送到客户端 我想坚持使用插座,而不是管道(我发现所有类

我正在用C编写两个程序(一个客户端,一个服务器),它们通过UNIX套接字相互通信。其思想是,客户端向服务器发送一个命令,如
ls-l
,服务器创建一个子(
fork()
),子对象执行
execlp(…,command,…)
,来自
execlp
的输出被放入客户端的终端窗口

但是,正如现在一样,我发送到服务器的命令的输出被写入服务器的终端窗口,而不是客户端的终端窗口。是否有方法从
execlp
获取输出,并通过带有
send(…,string,…)
的套接字将其发送到客户端


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

前面的答案是错误的;不知什么原因,我的心思都集中在管道上了。正如Jonathan Leffler在评论中指出的,您可以更优雅地实现这一点

  • 当一个新的连接出现时,
    fork
    一个它等待的新的子节点
  • 子节点从父节点继承套接字,父节点关闭它
  • 子项使用套接字替换其文件描述符:

    dup2(sockfd, STDIN_FILENO);  /* Check the return value for these. */
    dup2(sockfd, STDOUT_FILENO);
    dup2(sockfd, STDERR_FILENO);
    
  • execvp
    s根据客户端的请求执行新程序


是否有理由不操纵子
ls
,使其标准输出(和标准错误)进入套接字?@JonathanLeffler您能澄清一下吗?我希望服务器通过接受连接并在父节点恢复侦听时,让子节点管理请求来处理该过程。子进程将修复来自套接字的标准输入,并将标准输出和标准错误转到套接字,然后可以简单地
execvp()
请求的进程。当客户机与服务器位于不同的机器上时,这将起作用,而管道肯定不会跨机器工作。次要细节有待讨论,但总体主题是“将套接字转换为标准I/O流并运行程序”。@JonathanLeffler您完全正确。我没有任何解释为什么我如此执着于管道。首先,感谢您的帮助,execlp的输出现在出现在我的客户机中。我现在遇到的一个新问题是,如果我以“ls”开头,它会打印它应该打印的内容,但是我输入的以下命令会打印ls中最后11个文件,以及命令应该打印的内容。例如,“ls”前面的“ps”给出了:(ps的输出,看起来很好)。。。来自ls的11条线路。每次读取套接字后,我都会清除它(用strcpy将20个空格复制到字符串中),所以我不明白为什么它仍然打印最后11行。。。