C - 同时接收和处理来自unix套接字的数据

时间:2013-07-10 04:53:47

标签: c sockets fork

我有一个C程序,它通过Unix套接字与PHP通信。程序如下:PHP接受用户上传文件,然后向C发送“信号”,然后调度另一个进程(fork)解压缩文件(我知道这可以由PHP单独处理,这只是一个例子;整个问题更复杂)。

问题在于我不想说有4个进程同时运行。我认为这可以像这样解决:C,当它从PHP获取一个新的“任务”时将它转储到一个队列并逐个处理它们(确保运行时不超过4个)同时仍在监听插座。

我不确定如何实现这一点,因为我不能在同一个过程中做到这一点(或者我可以)?我以为我可以有另一个子进程来管理队列,父进程可以使用共享内存来访问,但这似乎过于复杂。还有其他方法吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您需要为每个任务处理程序设置单独的进程,那么您可以考虑使用五个单独的进程。第一个是侦听器,处理新的传入任务,并将其放入队列中。每个任务处理程序最初发送工作请求,以及完成处理任务的时间。当侦听器收到此请求时,它会将队列上的下一个任务传递给任务处理程序,或者如果任务队列为空,则将任务处理程序放在处理程序队列上。当任务队列从空转换为非空时,它会检查处理程序队列中是否有就绪任务处理程序。如果是这样,它将该任务处理程序从队列中取出,并将任务从任务队列传递到任务处理程序。

PHP进程会将任务放入侦听器,而任务处理程序将从侦听器获取任务。监听器只是等待put或get请求,并处理它们。您可以将侦听器视为一个简单的Web服务器,但是每个到PHP进程和每个任务处理程序的套接字连接都可以是持久的。

由于套接字的数量很少而且持久,所以任何多路复用调用都可以工作(selectpollepollkqueue,或者其他最好的或者可用于您的系统),但最简单的方法是使用单独的线程同步处理每个套接字。然后,就绪任务处理程序队列将是任务队列上的信号量或条件变量。处理来自PHP进程的put的线程会将任务放在任务队列上,然后放置信号量。处理就绪任务的每个线程都会按下信号量,然后从任务队列中取出任务。任务队列本身可能需要相互独占保护,具体取决于它的实现方式。