首页 > 解决方案 > 递归调用的 C 函数因 strtol_l_internal SIGSEGV 而失败

问题描述

我正在编写一些用 C 编写的非常古老的代码(90 年代初)。2012 年移植到 Linux。一个程序使用递归从端口读取数据并将读取的数据组装到存储在全局存储中的缓冲区中。它定义为:

char R_buffer[51000];

将数据加载到此缓冲区的函数执行标准的 linux 读取系统,以将 N 字节数据(最大 BUFSIZ)读取到分配的缓冲区中。然后逐字节移动到上面的 R_buffer 中。

正在使用的协议在正在读取的数据流中具有消息序列的开始和序列的结束。

遇到的问题是递归函数的返回在 strto_l_internal 中的信号 11 (SIGSEGV) 上失败,正如所产生的回溯所报告的那样。

调用从函数分配返回值的函数如下:

   inbyte = getnewchar(timeout_val);

Inbyte 被定义为一个字符。getnewchar 返回一个 char,它是 buf 中的 malloced 值之一。

请注意,读取使用 SIGALRM 计时器来检查是否有阻塞的数据传入。这个警报会以某种方式弄乱返回的数据吗?

谢谢。

标签: crecursion

解决方案


推荐阅读