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

C 访问填充了从管道读取的数据的结构时出现分段错误,c,C,在尝试访问名为Request的结构时,我一直存在分段错误,该结构中充满了从管道读取的数据。我的代码怎么了?这个错误是在一个简单的printf试图打印name字段时抛出的 结构定义: typedef struct { char code; pid_t pid; char *name; char *object; int id; void *buffer; size_t

在尝试访问名为Request的结构时,我一直存在分段错误,该结构中充满了从管道读取的数据。我的代码怎么了?这个错误是在一个简单的printf试图打印name字段时抛出的

结构定义:

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);

您是否正在传递您希望在读卡器代码中打开的标志


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

您可能正在通过管道发送Request.name的地址。当接收者收到它时,Request.name显然指向无效内存。

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

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

并对读者和作者进行相应的修改。如果管道在进程之间连接,则名称、对象和缓冲区包含的地址在新上下文中没有意义。

请不要在标题中写入标记。您的代码不是测试用例;特别是,它没有显示请求对象的创建。您是从哪里学会这种奇怪的代码格式风格的?我得说这是我从未见过的。好吧,我不再使用标签了。我只是发布了这些声明来关注问题的核心。比这更复杂的是:读取管道的过程在一段时间内不断读取管道以处理写入其中的数据。如果没有人在管道上写东西,进程用O_RDONLY标志打开它,它将在打开调用时抛出-1,我将不得不处理这种情况。使用O_RDWR标志,它将阻塞,直到进程本身在管道上写入或其他人执行此操作。字符串在写入进程中进行动态分配。但是,读取过程是一个小型服务器应用程序,由写入过程抛出fork+exec。抛出后,父进程开始通过管道中的子进程发送数据。我猜我无法读取子进程中分配给父进程的内存,如果是这样,我如何访问该字符串?在管道上写入整个内容本身?您可以确定字符串的固定大小并将其声明为数组,也可以编写自己的序列化/反序列化函数。我会选择第一个方案,因为我在过去的几年中已经充分探索了第二个方案,但没有什么好处。我也在考虑这个解决方案。但在这个小项目中,我必须使用规范表定义的一些结构:在这个结构中,每个字段都定义为字符串的指针char*和数据缓冲区的void*。然后,必须将此结构传递给服务器进程子进程,在这种情况下,子进程由第一个通过管道发送数据的进程分叉。如果我不能访问子进程中的这个内存区域,我应该如何处理由父关联内存分配的数据和缓冲区?必须有一些关于指针如何表示的规范。我在20世纪80年代多次遇到的一个问题是指针是相对于结构的开始的。但是,这里仍然缺少一些东西。名称必须在消息中的某个位置包含字符,或者它们以某种方式编码,可能是通过指向两端的标准字符串表。无论哪种方式,谜题的一个重要部分都缺失了。