信号回调和pthread同步

时间:2012-07-13 20:04:10

标签: c sockets serial-port pthreads signals

在我的应用程序上,我有一个pthread运行一段时间(1)读取套接字客户端和串行回调函数。我的应用程序从串行接收消息(如/ dev / ttyS0)并从套接字接收消息。问题:从串口收到一些消息后应用程序崩溃,此时套接字没有收到任何消息。但如果我评论线程创建,应用程序工作正常。

代码草稿:

// Socket Thread
static void *Socket(void *arg)
{
  // socket inicialization
  while (1)
  {
    ret = read(client, buffer, sizeof(buffer)-1);
    // do something
  }
}

// serial callback
static void SerialCallback(int id, unsigned char *buffer, int length)
{
    // do something
}

// main
int main (void)
{
  // start and configure serial callback
  cssl_start();
  Serial = cssl_open(SERIAL_PORT, SerialCallback, 0, 115200, 8, 0, 1);

  // create the pthread
  // If I comment the line below the app work fine
  pthread_create(&Thread_Socket, NULL, Socket, NULL);

  while (1)
  {
  }
}

注意:

  • 我使用库cssl(http://sourceforge.net/projects/cssl/)来处理序列号。该库使用实时信号。

  • 出于测试目的,我使用socat生成伪终端(如/ dev / pts / XX)

  • 每次串口接收一个或多个字节

  • 时,都会调用串行回调
  • 我正在使用cutecom向连续发送消息


在2012.07.16

中添加了新的测试信息

第一次测试:我将读取函数行替换为while(1);问题出现了(因此,问题与读取功能无关)。

第二次测试:使用完整代码(上面的示例),我使用两个外部usb /串行转换器环回连接,正常工作。

1 个答案:

答案 0 :(得分:1)

怎么说@Nikolai N Fetissov,该计划因EINTR信号而破裂。我查看了cssl库代码并更改了信号标志,从sa.sa_flags = SA_SIGINFO;sa.sa_flags = SA_SIGINFO | SA_RESTART;。工作

我联系了cssl项目开发人员Marcin Siennicki,并为他发送了这篇文章的链接。

感谢您的评论。