c - 信号回调和 pthread 同步

标签 c sockets serial-port pthreads signals

在我的应用程序上,我有一个 pthread 正在运行 while(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) 替换了 read 函数行;问题随之而来(因此,问题与读取功能无关)。

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

最佳答案

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

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

感谢评论。

关于c - 信号回调和 pthread 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477573/

相关文章:

c - 通过 20-30 GB 的多个日志文件搜索模式的最快方法是什么

c - 从二进制文件 c 构建一个 float

java - 使用 Mockito 模拟服务器-客户端连接

python - 有没有办法检查Python Socket中是否有传入消息

java - 从USB->RS232连接的终端接收数据

android - 如何在Android studio中调用.so库的方法

c - 使用指针从字符串中删除空格

c - C中交换字母的加密

c - 通过无线连接的两台计算机之间的信息交换

c - C 中串行输出错误