我正在用C写一个服务器 - 客户端应用程序,共享一些信息。服务器以双线程模式工作 - 主线程等待输入,而侧线程响应客户端的请求。客户端也是这样工作的,但它等待用户输入(来自stdin),并且如果它接收到正确的命令,它会向服务器发送请求并等待响应。等待在侧线程处理响应中完成。虽然这看起来很好,并在基于Ubuntu的发行版(我使用Ultimate Edition 2.7)上工作,但它在其他发行版上崩溃。这是发生了什么。Linux上的侧线程的malloc/calloc崩溃

服务器完美无缺地工作,但客户患有glibc检测到崩溃(我希望我输入正确)。当它收到响应时,它解析它的结构,它包含:a)头部,

b)一些静态标识符,

c)包含长度和数据本身的数据部分。

发生的是:

一个)客户端收到数据包,

b)中的客户端检查它(大小至少sizeof(header) + sizeof(static_data) + sizeof(length) + data - 和数据大小一样大的长度表示)),

c)创建一个结构 - 从字符缓冲区到上述结构的转换,d)创建一些存储这些结构的其他结构。

结构解释正确。我通过服务器的接口向客户端发送“固定”结构并打印原始数据,发送数据和接收到的信息来测试它。所以情况并非如此。一切都很好点c)。

至点d)我工作在用于接收传入数据包的缓冲区(指定了最大大小和缓冲区的大小)。存储我得到的数据结构。我这样做:

a)分配正确大小的新内存

b)复制数据。

我不是在讨论这个方法。只要它工作都没问题。但正如我所说,它不在其他发行版。它在a)点上的MALLOC分配内存时失败。它在一切上都失败了。我的猜测是,它可能是一个线程安全的malloc和/或printf在其他发行版上的问题,但问题是主线程大多数闲置在scanf(..)方法上。

返回主题:任何事情都会失败:

char* buffer = (char*)malloc(fixed_size * sizeof(char))

STRUCT_T* struct = (STRUCT_T*)malloc(sizeof(STRUCT_T))等等。无论我尝试分配什么,它总是会抛出glibc检测到的错误,并始终指向malloc方法(即使它是calloc)。

这让我想知道那有什么问题吗?这是我的线程问题。看起来有点像我充满'记忆空间',但我怀疑它,因为它总是发生在第一个响应接收。我会很乐意提供任何帮助,如果需要,可以发布更多细节。侧线可以连接。

选项与我编译:

CC = gcc CFLAGS = -Wall -ansi --pedantic -c -O0 -g -std=c99 -pthread $(CC) $(CFLAGS) server.c -o server.o gcc server.o $(OBJECTS) -o server -pthread -lm

和包括client.c文件:

sys/fcntl.h netdb.h errno.h stdio.h unistd.h stdlib.h string.h time.h pthread.h math.h

我不使用C和Linux新手,但我主要是在Windows和C++的工作,所以这是相当令人不安的。正如我所说的,它在我使用的发行版上工作得很好,但在正确解析缓冲区时却没有其他功能。

在此先感谢。

+1

我不认为这与线程直接有关,即使错误的代码可能在您的非主线程中。这几乎肯定是简单的内存损坏(写入缓冲区末尾)。 –

2011-05-24 14:28:08

+1

而规范的解决方案是在valgrind下运行你的程序。不幸的是,您在这里提供的信息不足以让我们给出比这更好的答案。 –

2011-05-24 14:29:29

+0

我无法想象如何。我有一个正常的指针在堆栈上,我尝试动态分配一些东西来指向它。我正在讨论像void* a = malloc(1);这样的正常分配。我会在稍后与valgrind合作。希望能够检测并指定错误。 –

2011-05-24 14:36:27

linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃相关推荐

  1. .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调、APM、EAP、TPL、aysnc、await

    windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线 ...

  2. 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略

    目录 引言 线程池使用场景 加快请求响应(响应时间优先) 加快处理大任务(吞吐量优先) 特殊说明 线程池的池化技术 线程池的创建 手动创建 创建newFixedThreadPool线程池 创建newS ...

  3. Linux上线程开发API概要(线程)

    进程与线程       典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理 ...

  4. 深入理解Linux内核之内核线程(上)

    1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 在linux系统中, 我们接触最多的莫过于 ...

  5. linux thread model . Linux上posix线程库实现原理讨论

    http://blog.csdn.net/fanbird2008/article/details/6752853 Linux上posix线程库实现原理讨论 说明一下,这个问题困扰我好长时间,因为正如使 ...

  6. Linux之多线程(上)——Linux下的线程概念

    文章目录 前言 一.地址空间和页表 1.二级页表 2.例子 二.线程 1.概念 重新理解前面讲的进程:在内核的视角,进程是承担分配系统资源的基本实体. 站在CPU角度,能否去识别当前调度的task_s ...

  7. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  8. Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)

    对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...

  9. linux 下的进程创建线程,Linux线程 之 线程 线程组 进程 轻量级进程(LWP)

    线程是有栈的,我们知道,普通的一个进程,它的栈空间是8M,我们可以通过ulmit -a查看: stack size (kbytes, -s) 8192 线程也不例外,线程也是需要栈空间的这句话是废话, ...

最新文章

  1. 程序员生存定律--管理向左,技术向右
  2. Py之chatterbot:python包之Chatterbot包/wxpy包简介、安装、使用方法之详细攻略
  3. 机器学习理论梳理2 : KNN K近邻分类模型
  4. CompletableFuture详解~applyToEither
  5. IDA动态调试Android的DEX文件
  6. 随机游走分割算法(Random Walk Segmentation Algorithm)
  7. JQuery获得绝对,相对位置的坐标方法
  8. Telegram 支持删除聊天双方设备中的消息记录
  9. spring-第十九篇AOP面向切面编程之增强处理的优先级
  10. linux 进程 D 状态,Linux 进程的 Uninterruptible sleep(D) 状态
  11. 廖雪峰Git教程学习总结
  12. html5 保存 搜索历史,前端实现搜索记录功能也就是天猫app历史记录存储方便浏览 - 今天的代码你撸了嘛...
  13. What is tethering and how do you enable tethering?
  14. 兆骑科创创业大赛,线上直播路演,高层次人才引进服务平台
  15. 基于JSP的汽车租赁管理系统的设计与实现
  16. 论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记
  17. 嵌入式C语言之零碎知识
  18. power automate功能概述与学习实践(Microsoft Flow)
  19. 前端VUE面试题总结
  20. mac不断弹出提示 要信任此电脑吗

热门文章

  1. python读取所有txt文件_python如何批量读取txt文件
  2. matlab 多个波段,MatLab读取ENVI图像统计多波段图像信息
  3. linux 增加lv大小,Linux增加LV(逻辑卷)容量
  4. 我的Java教程,不断整理,反复学习,记录着那些年大学奋斗的青春
  5. 四、数据仓库和Hive环境搭建
  6. 八十五、store数据,actionCreators 与 constants 的拆分和redux-immutable的使用
  7. 如何配置mysql8.0_安装和配置Mysql8.0
  8. ICLR 2022 | 香侬科技提出基于图神经网络的语义理解模型,获单项满分
  9. 飞桨领航团邀你出战!黑客松线下48H Coding Party等你来
  10. ACL 2020 | 基于不同硬件搜索更好的Transformer结构