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

问题描述 投票:0回答:3

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

现在我有一个程序,它

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

好吧,我可以让这个客户端将文本数据发送到我的程序,并使用

stdout

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

我将如何创建一个新进程(侦听并显示客户端计算机发送给它的文本,然后将该文本发送到另一个程序的

stdout

,而另一个程序负责
stdin
 被发送到客户端计算机)或创建 2 个程序来完成单独的工作(发送、接收和显示),并相互发送适当的数据?

抱歉,如果措辞奇怪,如果需要,我会澄清。我研究了

exec

execve
fork
 等,但很困惑这是否是合适的路径,或者是否有我缺少的更简单的方法。

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

编辑:回想起来,我认为使用两个单独的程序会更容易完成。一是 IM 服务器,二是 IM 客户端。

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

这将消除

stdin

stdout
复杂的进程/程序间通信的需要,而是,
使用简单的客户端/服务器通信方式,客户端程序显示从服务器发送到它的文本stdout
,并使用 
stdin
 将任何文本发送到服务器。 

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

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

accept()

从监听套接字返回的同一个套接字可用于发送和接收数据。所以你的套接字永远不会因为你正在读取它而“忙”......你可以在同一个套接字上写回。

如果您需要同时读写,则在两个不同的线程之间共享从

accept()

 返回的套接字。由于网络堆栈使用两个不同的缓冲区在套接字上发送和接收,因此一个用于读取的专用线程和另一个用于写入套接字的专用线程将是线程安全的,无需使用互斥体。


0
投票
我会使用 fork() - 创建一个子进程,现在你有两个不同的进程,它们可以在两个不同的套接字上执行两种不同的操作 - 一个可以接收,另一个可以发送。我还没有编写这样的客户端/服务器的个人经验,但这将是我第一次尝试解决您的问题......


0
投票
正如 @bdonlan 在评论中提到的,您肯定需要像

select 或最好是 poll 这样的多路复用调用(或相关的系统调用,如 pselect

ppoll
 ...)。这些多路复用调用是同时在多个通道上等待的原语(
pselect
ppoll
 能够原子地等待 I/O 事件和信号)。另请阅读 
select 教程 手册页。当然,您可以在同一个 select
poll
 系统调用中等待多个文件描述符,并且可以等待读写能力(即使在同一个套接字上,如果需要)。

所有基于事件的循环和框架都在使用这些多路复用调用(如

poll

select
)。您还可以使用 
libevent,甚至(特别是在编写图形用户界面应用程序时)一些 GUI 工具包,例如 Gtk 或 Qt,它们都基于中央事件循环。

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

您可能还要求使用

fcntl

SIGIO 在数据到达套接字时获得 F_SETOWN
 信号,但这对您来说不是很有用。那么你经常希望你的套接字是非阻塞的。 

© www.soinside.com 2019 - 2024. All rights reserved.