pcap进入qthread

时间:2013-01-09 07:11:40

标签: libpcap qthread

我正在使用Qt库在Linux下编写一个应用程序。

所以,有两个QThreads。在其中一个线程pcap_next()函数中调用while周期。所有线程在工作期间经常使用彼此的公共成员。

不使用pcap库(例如从硬盘读取数据包)一切正常,但当我尝试将pcap的函数放入单独的thread时,我有SEGFAULT错误。

我无法理解pcap的工作原理。它看起来像pcap冻结整个过程,因此线程无法访问彼此的公共成员。

pcap线程的主run()函数如下:

while()
{
   Data = pcap_next(handle, &header);
   if (Data...)
   {
        //processing functions
   }
}

任何想法?

1 个答案:

答案 0 :(得分:2)

“冻结整个过程”会阻止其他线程进行运行;它不会导致进程崩溃。

如果您的程序在多个线程中的单个pcap_t上同时进行调用,除了pcap_breakloop()之外的某些安全调用(不会中断被阻止的线程),您需要在UN * X中发出信号来做到这一点),无法保证它能够正常工作。

如果您从未在不同线程中的同一pcap_t上同时进行pcap调用,则应该可以正常工作。

即,您可以在一个线程中打开设备/保存文件,获得pcap_t,并且一旦完成,就有相同的线程或另一个线程从pcap_t读取数据包。但是,您不能让多个线程从pcap_t读取数据包。

但是,使用pcap的方式可能有问题,即使在单线程程序中也会崩溃。我们必须看到你所有的pcap电话,看看是否是这种情况。