C、 UNIX。通过UNIX套接字从execlp发送输出
我正在用C编写两个程序(一个客户端,一个服务器),它们通过UNIX套接字相互通信。其思想是,客户端向服务器发送一个命令,如C、 UNIX。通过UNIX套接字从execlp发送输出,c,sockets,unix,output,C,Sockets,Unix,Output,我正在用C编写两个程序(一个客户端,一个服务器),它们通过UNIX套接字相互通信。其思想是,客户端向服务器发送一个命令,如ls-l,服务器创建一个子(fork()),子对象执行execlp(…,command,…),来自execlp的输出被放入客户端的终端窗口 但是,正如现在一样,我发送到服务器的命令的输出被写入服务器的终端窗口,而不是客户端的终端窗口。是否有方法从execlp获取输出,并通过带有send(…,string,…)的套接字将其发送到客户端 我想坚持使用插座,而不是管道(我发现所有类
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);
- 子
s根据客户端的请求执行新程序execvp
ls
,使其标准输出(和标准错误)进入套接字?@JonathanLeffler您能澄清一下吗?我希望服务器通过接受连接并在父节点恢复侦听时,让子节点管理请求来处理该过程。子进程将修复来自套接字的标准输入,并将标准输出和标准错误转到套接字,然后可以简单地execvp()
请求的进程。当客户机与服务器位于不同的机器上时,这将起作用,而管道肯定不会跨机器工作。次要细节有待讨论,但总体主题是“将套接字转换为标准I/O流并运行程序”。@JonathanLeffler您完全正确。我没有任何解释为什么我如此执着于管道。首先,感谢您的帮助,execlp的输出现在出现在我的客户机中。我现在遇到的一个新问题是,如果我以“ls”开头,它会打印它应该打印的内容,但是我输入的以下命令会打印ls中最后11个文件,以及命令应该打印的内容。例如,“ls”前面的“ps”给出了:(ps的输出,看起来很好)。。。来自ls的11条线路。每次读取套接字后,我都会清除它(用strcpy将20个空格复制到字符串中),所以我不明白为什么它仍然打印最后11行。。。