日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃

發(fā)布時(shí)間:2024/10/5 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我正在用C寫一個(gè)服務(wù)器 - 客戶端應(yīng)用程序,共享一些信息。服務(wù)器以雙線程模式工作 - 主線程等待輸入,而側(cè)線程響應(yīng)客戶端的請(qǐng)求??蛻舳艘彩沁@樣工作的,但它等待用戶輸入(來自stdin),并且如果它接收到正確的命令,它會(huì)向服務(wù)器發(fā)送請(qǐng)求并等待響應(yīng)。等待在側(cè)線程處理響應(yīng)中完成。雖然這看起來很好,并在基于Ubuntu的發(fā)行版(我使用Ultimate Edition 2.7)上工作,但它在其他發(fā)行版上崩潰。這是發(fā)生了什么。Linux上的側(cè)線程的malloc/calloc崩潰

服務(wù)器完美無缺地工作,但客戶患有g(shù)libc檢測(cè)到崩潰(我希望我輸入正確)。當(dāng)它收到響應(yīng)時(shí),它解析它的結(jié)構(gòu),它包含:a)頭部,

b)一些靜態(tài)標(biāo)識(shí)符,

c)包含長(zhǎng)度和數(shù)據(jù)本身的數(shù)據(jù)部分。

發(fā)生的是:

一個(gè))客戶端收到數(shù)據(jù)包,

b)中的客戶端檢查它(大小至少sizeof(header) + sizeof(static_data) + sizeof(length) + data - 和數(shù)據(jù)大小一樣大的長(zhǎng)度表示)),

c)創(chuàng)建一個(gè)結(jié)構(gòu) - 從字符緩沖區(qū)到上述結(jié)構(gòu)的轉(zhuǎn)換,d)創(chuàng)建一些存儲(chǔ)這些結(jié)構(gòu)的其他結(jié)構(gòu)。

結(jié)構(gòu)解釋正確。我通過服務(wù)器的接口向客戶端發(fā)送“固定”結(jié)構(gòu)并打印原始數(shù)據(jù),發(fā)送數(shù)據(jù)和接收到的信息來測(cè)試它。所以情況并非如此。一切都很好點(diǎn)c)。

至點(diǎn)d)我工作在用于接收傳入數(shù)據(jù)包的緩沖區(qū)(指定了最大大小和緩沖區(qū)的大小)。存儲(chǔ)我得到的數(shù)據(jù)結(jié)構(gòu)。我這樣做:

a)分配正確大小的新內(nèi)存

b)復(fù)制數(shù)據(jù)。

我不是在討論這個(gè)方法。只要它工作都沒問題。但正如我所說,它不在其他發(fā)行版。它在a)點(diǎn)上的MALLOC分配內(nèi)存時(shí)失敗。它在一切上都失敗了。我的猜測(cè)是,它可能是一個(gè)線程安全的malloc和/或printf在其他發(fā)行版上的問題,但問題是主線程大多數(shù)閑置在scanf(..)方法上。

返回主題:任何事情都會(huì)失敗:

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

STRUCT_T* struct = (STRUCT_T*)malloc(sizeof(STRUCT_T))等等。無論我嘗試分配什么,它總是會(huì)拋出glibc檢測(cè)到的錯(cuò)誤,并始終指向malloc方法(即使它是calloc)。

這讓我想知道那有什么問題嗎?這是我的線程問題??雌饋碛悬c(diǎn)像我充滿'記憶空間',但我懷疑它,因?yàn)樗偸前l(fā)生在第一個(gè)響應(yīng)接收。我會(huì)很樂意提供任何幫助,如果需要,可以發(fā)布更多細(xì)節(jié)。側(cè)線可以連接。

選項(xiàng)與我編譯:

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++的工作,所以這是相當(dāng)令人不安的。正如我所說的,它在我使用的發(fā)行版上工作得很好,但在正確解析緩沖區(qū)時(shí)卻沒有其他功能。

在此先感謝。

+1

我不認(rèn)為這與線程直接有關(guān),即使錯(cuò)誤的代碼可能在您的非主線程中。這幾乎肯定是簡(jiǎn)單的內(nèi)存損壞(寫入緩沖區(qū)末尾)。 –

2011-05-24 14:28:08

+1

而規(guī)范的解決方案是在valgrind下運(yùn)行你的程序。不幸的是,您在這里提供的信息不足以讓我們給出比這更好的答案。 –

2011-05-24 14:29:29

+0

我無法想象如何。我有一個(gè)正常的指針在堆棧上,我嘗試動(dòng)態(tài)分配一些東西來指向它。我正在討論像void* a = malloc(1);這樣的正常分配。我會(huì)在稍后與valgrind合作。希望能夠檢測(cè)并指定錯(cuò)誤。 –

2011-05-24 14:36:27

總結(jié)

以上是生活随笔為你收集整理的linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。