【问题标题】:signal callback and pthread sync信号回调和 pthread 同步
【发布时间】:2012-07-13 20:04:09
【问题描述】:

在我的应用程序上,我有一个运行 while(1) 的 pthread,它读取一个套接字客户端和一个串行回调函数。我的应用程序从串行(如 /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) 替换了 read 函数的行;问题随之而来(因此,问题与读取功能无关)。

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

【问题讨论】:

  • 能否提供错误/崩溃报告?
  • 没有错误,静默退出。
  • 信号传递可能会中断您在套接字读取线程中的read(2)。检查errno(3) 的值。是EINTR吗?
  • 您确定sizeof(buffer) 可以按预期工作吗?字符串的sizeof 将返回字节数,直到第一个null 终止符。尝试传递硬编码的读取大小以消除内存损坏的可能性。
  • 请提供一个能够重现故障的工作示例。到目前为止发布的代码非常不完整,需要检查...

标签: c sockets serial-port pthreads signals


【解决方案1】:

@Nikolai N Fetissov 怎么说,程序中断是因为 EINTR 信号。我查看了 cssl 库代码并将信号标志从:sa.sa_flags = SA_SIGINFO; 更改为 sa.sa_flags = SA_SIGINFO | SA_RESTART;。工作。

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

感谢 cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多