1
**编辑:我已经找到了解决办法**FD_SET从无效内存地址读取?
我对那些谁也不敢下面读一个奇怪的问题:
我工作的家庭作业,并且需要发送使用UNIX管道的进程之间的消息。
我用这段代码的意图是在提供的文件描述符上选择()。如果有东西可以不阻塞地阅读,我想返回它。如果不是,我想返回NULL并继续不阻塞。
这里是我的“的getMessage”功能,其中fd是文件描述符的内部代码:
message* getMessage(int fd){
int messageAvailable = 0;
struct timeval timeout;
fd_set fd2;
//If there's a message available, read it; if not, continue on without delay
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&fd2);
FD_SET(fd,&fd2);
messageAvailable = select(FD_SETSIZE,&fd2,NULL,NULL,&timeout);
if(messageAvailable){
int bytesRead = 0;
message* m;
m = malloc(sizeof(message));
//Get the header
bytesRead = read(fd,m,sizeof(message));
//If we got the whole message
if(bytesRead == sizeof(message)){
return m;
}else{
//If a message wasn't generated, free the space we allocated for it
free(m);
return NULL;
}
}else{
return NULL;
}
}
此代码是持续的节目的持续时间在一个循环内,并在完全相同的点(在一条消息成功传输后的下一个getMessage()调用)它的段错误。显然FD_SET行正在从无效的内存位置读取。
没有发布我的所有代码,任何人都可以猜测可能会发生什么导致这个简单的宏中的段错误?
我已经发布了相关的调试信息如下,其中线33与FD_SET线以上对应:
==1330== Invalid read of size 1
==1330== at 0x804E819: getMessage (messages.c:33)
==1330== by 0x8049123: main (messageTest.c:110)
==1330== Address 0xde88d627 is not stack'd, malloc'd or (recently) free'd
==1330==
==1330==
==1330== Process terminating with default action of signal 11 (SIGSEGV)
==1330== Access not within mapped region at address 0xDE88D627
==1330== at 0x804E819: getMessage (messages.c:33)
==1330== by 0x8049123: main (messageTest.c:110)
==1330== If you believe this happened as a result of a stack
==1330== overflow in your program's main thread (unlikely but
==1330== possible), you can try to increase the size of the
==1330== main thread stack using the --main-stacksize= flag.
==1330== The main thread stack size used in this run was 8388608.
==1330==
==1330== HEAP SUMMARY:
==1330== in use at exit: 344 bytes in 10 blocks
==1330== total heap usage: 25 allocs, 15 frees, 2,492 bytes allocated
==1330==
==1330== LEAK SUMMARY:
==1330== definitely lost: 12 bytes in 1 blocks
==1330== indirectly lost: 0 bytes in 0 blocks
==1330== possibly lost: 0 bytes in 0 blocks
==1330== still reachable: 332 bytes in 9 blocks
==1330== suppressed: 0 bytes in 0 blocks
==1330== Rerun with --leak-check=full to see details of leaked memory
==1330==
==1330== For counts of detected and suppressed errors, rerun with: -v
==1330== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 11 from 6)
Segmentation fault
可以发布更多的代码,我可以看到没有什么明显错误的发布内容。除了如果'select()'失败,它返回'-1'并且'if(messageAvailable)'将评估为'true':改为'if(messageAvailable> 0)'。为什么不对'select()'的第一个参数使用'fd +'1? – hmjd 2012-03-05 21:31:05
是的......很含糊的问题;对此我很抱歉。不过,我找到了解决方案。原来我传递一个无效的文件描述符到getMessage。 关于我的消息的好处可用警卫;我会改变它。谢谢 :) – BraedenP 2012-03-05 21:44:30