【问题标题】:C,UNIX. Sending output from execlp through a UNIX socket [duplicate]C,UNIX。通过 UNIX 套接字从 execlp 发送输出 [重复]
【发布时间】:2014-02-12 17:32:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: c sockets unix output


    【解决方案1】:

    之前的答案是错误的;出于某种原因,我的注意力集中在管道上。正如 Jonathan Leffler 在 cmets 中指出的那样,您可以更优雅地实现这一目标。

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

      dup2(sockfd, STDIN_FILENO);  /* Check the return value for these. */
      dup2(sockfd, STDOUT_FILENO);
      dup2(sockfd, STDERR_FILENO);
      
    • 应客户要求,孩子execvps 新程序

    【讨论】:

    • 是否有理由不操纵孩子ls 使其标准输出(和标准错误)进入套接字?
    • @JonathanLeffler 你能澄清一下吗?
    • 我希望服务器通过接受连接并派生一个孩子来管理请求,同时父母继续收听。孩子将修复标准输入来自套接字,标准输出和标准错误进入套接字,然后可以简单地execvp()请求的进程。当客户端与服务器位于不同的机器上时,这将起作用,而管道绝对不会跨机器工作。小细节有待讨论,但总体论点是“使套接字成为标准 I/O 流并运行程序”。
    • @JonathanLeffler 你是完全正确的。我没有任何解释为什么我如此固定在管道上。
    • 首先,感谢您的帮助,execlp 的输出现在出现在我的客户端中。我现在遇到的一个新问题是,如果我以“ls”开头,它会打印应该打印的内容,但是我输入的以下命令会打印来自 ls 的最后 11 个文件以及该命令应该打印的内容。例如,“ls”前面的“ps”给出:(ps 的输出,看起来不错)... ls 的 11 行。每次从套接字读取后,我都会清除它(通过使用 strcpy 将 20 个空格复制到字符串中)所以我不明白为什么它仍然打印最后 11 行...
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 2021-09-06
    • 2011-02-09
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多