繁体   English   中英

在Linux上的C中,我将如何使用2个程序,后者将文本数据发送到使用stdout显示的第一个程序?

[英]In C on Linux, how would I go about using 2 programs, the latter sending text data to the first displayed using stdout?

我正在Linux上C编写一个简单的即时通讯程序。

现在,我有一个程序,该程序将套接字绑定到本地计算机上的端口,并侦听由连接到本地计算机IP和端口的另一个程序发送的文本数据。

好吧,我可以让该客户端将文本数据发送到我的程序,并在本地计算机上使用stdout显示它; 但是,我无法编写一种将数据发送回客户端计算机的方法 ,因为我的程序正忙于侦听和显示客户端计算机发送的文本。

我该如何创建一个新进程(侦听并显示客户端计算机发送给它的文本,然后接收该文本并将其发送到另一个程序的stdout ,而另一个程序负责将stdin发送到客户端计算机)还是创建2个程序来执行单独的工作(发送,接收和显示),然后将适当的数据相互发送?

对不起,如果措辞怪异,我将澄清是否需要。 我查看了execexecvefork等,但是对于这是否是适当的查找路径或者是否缺少一种更简单的方法感到困惑。

任何帮助将不胜感激,谢谢。

编辑 :回想起来,我认为使用2个单独的程序可以轻松完成此操作。 一个是IM服务器,另一个是IM客户端。

IM客户端将连接到IM服务器程序,并将他们想要的任何文本发送到IM服务器。 然后,IM服务器将只是将发送给它的数据记录在一个缓冲区/文件中,并将客户机的名称/ ip附加在每个客户机发送给它的文本之后,然后将该文本(以name:text的格式)发送给每个连接的客户端。

这将消除对stdinstdout进行复杂的进程间/程序通信的需要,而是使用一种简单的客户端/服务器通信方式 ,其中客户端程序显示通过stdout从服务器发送到服务器的文本,并使用stdin发送发送到服务器的任何文本。

如此说,我仍然对有人回答我最初的问题感兴趣:科学。 谢谢大家的阅读,希望有人能从我的头脑风暴或社区得到的任何答案中受益。

但是,我无法编写一种将数据发送回客户端计算机的方法,因为我的程序正忙于侦听和显示客户端计算机发送的文本。

accept()从侦听套接字返回的套接字可以用于发送和接收数据。 因此,您的套接字永远不会“繁忙”,因为您正在从中读取...您可以在同一套接字上回写。

如果您需要同时进行读写,则可以在两个不同的线程之间共享从accept()返回的套接字。 由于网络堆栈使用两个不同的缓冲区在套接字上进行发送和接收,因此用于读取套接字的专用线程和用于写入套接字的另一个专用线程将是线程安全的,而无需使用互斥锁。

我将使用fork()-创建一个子进程,现在您有两个不同的进程可以在两个不同的套接字上执行两个不同的操作-一个可以接收,另一个可以发送。 我还没有为这样的客户端/服务器编写代码的个人经验,但这将是我解决您的问题的第一步。

正如@bdonlan在评论中提到的那样,您肯定需要像select或优选poll这样的复用调用(或相关的syscall如pselectppoll ...)。 这些多路复用调用是一次在几个通道上等待的原语( pselectppoll能够原子地等待I / O事件和信号)。 另请阅读选择教程手册页。 当然,您可以等待几个文件描述符,并且可以在同一selectpoll syscall中等待两种读写功能(即使需要,也可以在同一套接字上)。

所有基于事件的循环和框架都在使用这些多路复用调用(例如pollselect )。 您还可以使用libevent ,甚至(尤其是在对图形用户界面应用程序进行编码时)使用某些Gtk或Qt之类的GUI工具包,它们都基于中央事件循环。

我认为拥有多进程或多线程应用程序对您的情况没有帮助。 您只需要一些事件循环。

fcntlF_SETOWN将数据到达套接字时,您可能还要求获取SIGIO信号,但这对您不是很有用。 然后,您通常想使套接字无阻塞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM