Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux上的C语言中,我将如何使用2个程序,后者将文本数据发送到使用标准输出显示的第一个程序?_C_Linux_Process_Stdin_Communicate - Fatal编程技术网

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

在Linux上的C语言中,我将如何使用2个程序,后者将文本数据发送到使用标准输出显示的第一个程序?,c,linux,process,stdin,communicate,C,Linux,Process,Stdin,Communicate,我正在用Linux上的C编写一个简单的instant messenger程序 现在我有一个程序,将套接字绑定到本地机器上的一个端口,侦听连接到本地机器IP和端口的另一个程序发送的文本数据 好的,我可以让这个客户端向我的程序发送文本数据,并在本地机器上使用stdout显示它;但是,我无法编程将数据发送回客户机的方法,因为我的程序正忙于侦听和显示客户机发送的文本 我如何创建一个新进程(侦听并显示客户端机器发送给它的文本,然后获取该文本并将其发送到另一个程序的stdout,而另一个程序负责将stdin

我正在用Linux上的C编写一个简单的instant messenger程序

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

好的,我可以让这个客户端向我的程序发送文本数据,并在本地机器上使用
stdout
显示它;但是,我无法编程将数据发送回客户机的方法,因为我的程序正忙于侦听和显示客户机发送的文本

我如何创建一个新进程(侦听并显示客户端机器发送给它的文本,然后获取该文本并将其发送到另一个程序的
stdout
,而另一个程序负责将
stdin
发送到客户端机器)或创建两个执行单独作业的程序(发送、接收和显示),并相互发送适当的数据

如果这句话用词奇怪,我很抱歉,如果需要的话,我会澄清。我查看了
exec
execve
fork
,等等。但我不清楚这是否是查找的合适路径,或者是否有我缺少的更简单的方法

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

编辑:回想起来,我认为使用两个独立的程序可以更轻松地完成这一任务。一个是IM服务器,另一个是IM客户端

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

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

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

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

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

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

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

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

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

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


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

正如@bdonlan在评论中提到的,您肯定需要一个multiplexing调用(或相关系统调用,如
pselect
ppoll
)。这些多路复用调用是一次在多个通道上等待的原语(使用
pselect
ppoll
可以自动等待I/O事件和信号)。请阅读手册页。当然,您可以在相同的
系统调用中等待几个文件描述符,也可以同时等待读取和写入功能(如果需要,甚至在同一个套接字上)

所有基于事件的循环和框架都使用这些多路复用调用(如
poll
select
)。您也可以使用,甚至(尤其是在编写图形用户界面应用程序时)一些GUI工具包,如Gtk或Qt,它们都基于中心事件循环

我认为多进程或多线程应用程序在您的情况下并不有用,您只需要一些事件循环

您还可以请求获取
SIGIO