访问填充了从管道读取的数据的结构时出现分段错误

     2023-02-16     304

关键词:

【中文标题】访问填充了从管道读取的数据的结构时出现分段错误【英文标题】:Segmentation fault while accessing struct filled with data read from pipe 【发布时间】:2011-04-19 22:25:08 【问题描述】:

在尝试访问名为 Request 的结构时,我一直遇到分段错误,该结构填充了从管道读取的数据。我的代码有什么问题?错误在这里抛出一个简单的 printf 试图打印名称字段

结构定义:

typedef struct 

    char code;      
    pid_t pid;       
    char *name;      
    char *object;    
    int id;          
    void *buffer;    
    size_t size;     
 Request;

编写者代码:

request.code   = MANADDUSER;   /* macro defining a char */
request.pid    = getpid();
request.name   = argument1;   /* dinamycally allocated string */
request.object = NULL;
request.id     = 0;
request.buffer = NULL;
request.size   = 0;
if((fifoto = open(FIFOTOMMBOXD, O_WRONLY)) == -1)   logMmboxman("error in opening FIFOTO\n", 1); 
else                                                logMmboxman("opened FIFOTO\n", 0);  

if((write(fifoto, &request, sizeof(Request))) != sizeof(Request))   logMmboxman("error in writing FIFOTO\n", 1);
else                                                                logMmboxman("written on FIFOTO\n", 0);
close(fifoto);

阅读器代码:

if((fifoto = open(FIFOTOMMBOXD, O_RDWR)) == -1)   logMmboxd("error in opening FIFOTO\n", 1); 
else                                              logMmboxd("opened FIFOTO\n", 0);  

if((read(fifoto, &request, sizeof(Request))) != sizeof(Request))   logMmboxd("error in reading FIFOTO\n", 1);
else                                                               logMmboxd("read from FIFOTO\n", 0);
close(fifoto);

printf("%s\n", request.name);

【问题讨论】:

请不要在标题中写标签。 你的代码不是测试用例;特别是,它没有显示 Request 对象的创建。 你是从哪里找到这种奇怪的代码格式样式的?我不得不说这是我以前从未见过的。 好的,我不会再使用标签了。我只发布了这些陈述以关注问题的核心。 【参考方案1】:

您可能正在通过管道发送Request.name 的地址。接收方拿到后,Request.name明显指向无效内存。

【讨论】:

字符串在写入过程中动态分配。然而,读取进程是一个小型服务器应用程序,由写入进程通过 fork+exec 抛出。一旦抛出,父进程开始通过管道内的子进程发送数据。我想我无法在子进程中读取分配给父进程的内存,如果是这样,我该如何访问该字符串?在管道上写下整个内容本身? 您可以确定字符串的固定大小并将其声明为数组,或者您可以编写自己的序列化/反序列化函数。我会选择第一个选项(因为我已经充分探索了第二个选项,但没有什么好处)。【参考方案2】:

这可以通过将结构更改为以下内容来解决:

typedef struct 

    char   code;      
    pid_t  pid;       
    char   name[SOMESIZE];
    char   object[SOMEOTHERSIZE];
    int    id;          
    size_t size;     
 Request;

并对读写器进行相应的修改。如果管道是在进程之间连接的,那么nameobjectbuffer所包含的地址在新的上下文中是没有意义的。

【讨论】:

我也在考虑这个解决方案。但是在这个小项目中,我必须使用规范表(?)定义的一些结构:在这个结构中,每个字段都定义为一个指针(char * 用于字符串,void * 用于数据缓冲区)。然后必须将此结构传递给服务器进程(在这种情况下,子进程由第一个通过管道发送数据的进程 forked())。如果我无法在子进程中访问此内存区域,我应该如何处理由父关联内存分配的数据和缓冲区? 必须有一些关于如何表示指针的规范。我在 1980 年代多次遇到的一个问题是指针相对于结构的开头。但是,这里仍然缺少一些东西。 name 必须在消息中的某处包含字符,或者它们以某种方式编码,可能是通过指向两端的标准字符串表。无论哪种方式,都缺少重要的一块拼图。【参考方案3】:

您是否将您希望在阅读器代码中打开的标志传递给?

我原以为你想要 O_RDONLY 而不是 O_RDWR。

【讨论】:

比这更复杂:读取管道的过程会在一段时间内继续读取(1)管道处理写入其上的数据。如果没有人在管道上写入并且进程使用 O_RDONLY 标志打开它,它将在 open 调用中抛出 -1,我将不得不处理这种情况。使用 O_RDWR 标志,它将阻塞,直到进程本身在管道上写入或其他人这样做。

使用管道时出现分段错误

】使用管道时出现分段错误【英文标题】:Segmentationfaultwhenusingpipe【发布时间】:2014-03-2115:52:43【问题描述】:我正在做的分配要求并行使用10个进程对两个数组求和,所以我编写了这段代码,并且我使用管道到IPC之间的父级和... 查看详情

访问结构时出现分段错误

】访问结构时出现分段错误【英文标题】:segmentationfaultwhenaccesingintoastructure【发布时间】:2014-05-0922:49:23【问题描述】:当我为level->description执行printf命令时,程序给出了分段错误。我不知道为什么。我应该使用malloc来修复... 查看详情

访问共享内存时出现分段错误

】访问共享内存时出现分段错误【英文标题】:SegmentationFaultwhileacessingsharedmemory【发布时间】:2019-07-3111:25:25【问题描述】:我想为我的应用程序使用共享内存。我有两个过程。一个将创建共享内存(写入器),另一个将附加到... 查看详情

访问共享进程内存时出现分段错误(核心转储)

】访问共享进程内存时出现分段错误(核心转储)【英文标题】:Segmentationfault(coredumped)whenaccessingsharedprocessmemory【发布时间】:2019-05-0217:06:52【问题描述】:我试图让两个子进程将两个随机整数写入共享内存,然后让父进程读... 查看详情

为啥在尝试使用指针访问结构时出现此分段错误?

】为啥在尝试使用指针访问结构时出现此分段错误?【英文标题】:whyamigettingthissegmentationfaultwhentryingtoaccessastructusingapointer?为什么在尝试使用指针访问结构时出现此分段错误?【发布时间】:2020-12-1206:21:22【问题描述】:我正... 查看详情

尝试锁定共享内存互斥体时出现分段错误

...互斥体,并写入数据。消费者打开共享内存,尝试锁定和读取数据。没有互斥体,消费者可以读取数据(数据会不一致,但没有seg错误)只有当 查看详情

删除以结构为键的地图时出现分段错误

】删除以结构为键的地图时出现分段错误【英文标题】:segmentationfaultwhendeletingamapwithstructbeingthekeys【发布时间】:2012-02-2915:51:10【问题描述】:在我的代码中,我有一个用作映射键的结构:structindexintx;inty;intz;booloperator<(constin... 查看详情

发送具有 std::vector 成员的结构时出现分段错误

】发送具有std::vector成员的结构时出现分段错误【英文标题】:Segmentationfaultwhensendingstructhavingstd::vectormember【发布时间】:2017-02-2510:14:30【问题描述】:为什么我使用mpirun-np2./out命令得到以下代码的以下错误?我在调整std::vector... 查看详情

使用共享内存时出现分段错误

...】:2020-02-1510:18:55【问题描述】:此代码执行以下操作:读取“读取”文本文件的内容并将其写入共享内存空间。代码一直工作到昨天,但相同的代码今天显示分段错误。你能帮我弄清楚我在哪里犯了错误吗?#include<sys/ipc.h>... 查看详情

c中的memset struct数组时出现分段错误

...904:24:24【问题描述】:我正在尝试清空结构数组中的所有数据。但事实证明是分段错误。谁能帮帮我。结构structentrycharuser;charname[9];charextension[4];shortblockcount;shortblock[8] 查看详情

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

】在C++中使用指针的数组:访问返回的数组时出现分段错误【英文标题】:arraysusingpointersinc++:segmentationfaultwhenaccessingthereturnedarray【发布时间】:2016-11-2817:06:12【问题描述】:我是C++新手,我正在尝试使用指向指针的指针构建一... 查看详情

删除时出现分段错误

...:26【问题描述】:我是C++的新手,我正在尝试实现一个树结构,但我遇到了一个分段错误,该错误在删除树时出现。这段代码很简单,我有一个Node类,其中包含指向其子节点的指针。#include<vector>classNodepublic:intdata1,data2;std::v... 查看详情

当我在 C++ 中使用结构创建节点时出现分段错误

】当我在C++中使用结构创建节点时出现分段错误【英文标题】:IgetasegmentationfaultwhenIcreateanodewithastructinc++【发布时间】:2015-06-1300:51:05【问题描述】:我使用以下结构作为堆的节点structNodeintk;*p,**array;然后我创建了一个类,它是... 查看详情

创建列表时出现分段错误

...间】:2021-12-1004:41:04【问题描述】:我正在创建一个新的结构列表,我将在其中保存有关一系列汽车的一些信息。我编译代码没有问题,但是一旦我运行它就会出现分段错误。这是问题所在的代码:car*insertNode(car*head)car*temp;car*pr... 查看详情

向结构成员添加值时出现结构分段错误

】向结构成员添加值时出现结构分段错误【英文标题】:Structsegmentationfaultwhenaddingvaluestostructmembers【发布时间】:2021-02-1917:54:57【问题描述】:我在new_session-&gt;sid=sid;遇到分段错误。不知道为什么。伪会话列表.htypedefchar*user;t... 查看详情

带有分区的外部配置单元表 - 当我添加具有读取访问权限的数据的分区时出现权限错误

】带有分区的外部配置单元表-当我添加具有读取访问权限的数据的分区时出现权限错误【英文标题】:Externalhivetablewithpartition-permissionerrorwheniaddpartitionwiththedatahavingreadaccess【发布时间】:2016-09-0122:21:49【问题描述】:我收到以... 查看详情

访问向量类成员时出现分段错误

】访问向量类成员时出现分段错误【英文标题】:Segmentationfaultonaccessingvectorclassmember【发布时间】:2017-03-1717:34:24【问题描述】:我在C++中的这一行出现分段错误:vector<TemplateElement*>children=getChildren();类That继承自抽象类Templa... 查看详情

为啥在访问二级指针时出现分段错误错误? C语言

】为啥在访问二级指针时出现分段错误错误?C语言【英文标题】:Whyamigettingsegmentationfaulterrorwhileaccessingasecondlevelpointer??Clanguage为什么在访问二级指针时出现分段错误错误?C语言【发布时间】:2021-06-2102:18:43【问题描述】:以下... 查看详情