以下是我从管道函数读取的代码片段。这样可以正确执行并验证数据是否已进入缓冲区。
int readFrom(char *buffer)
{
int nread;
if((nread = read(readfd,buffer,100)) < 0)
{
printf("\nerror in reading data from FIFO\n");
return(-1);
}
buffer[nread]='\0';
return(0);
}
在上面的示例中,nread小于100。我使用的是GCC-4.7.0。
我们有一个上面函数的抽象层,如下所示:
int pipe_input(char *parmPtr, int size)
{
char readMsg[100];
if( readFrom((char *)&readMsg) == -1)
return ERROR;
if (strlen(readMsg) < 1)
{
printf("Incorrect Input\n");
return ERROR;
}
strncpy(parmPtr, readMsg, ((size < 100)?size:100));
return 0;
}
在上面的函数中,验证了读取消息是正确的,并且parmptr正确加载了该值。但在函数Where我试图调用pipe_input我得到一个sigsegv。这种情况发生在GCC-4.7.0中,但使用GCC-4.2.4编译的相同代码执行正常。我验证了警告,但上面没有任何警告。任何指针都非常有帮助。
下面的代码片段,用于调用pipe_input:
int Calling_func(void)
{
char alpha[100] ;
pipe_input(alpha,100);
printf("alpha value is %s \r\n",alpha);
}
在打印声明中获取sigsegv。
答案 0 :(得分:2)
您的代码中有一个错误的错误。你的数组有100个元素,但是你没有考虑NULL终止:
strncpy(parmPtr, readMsg, ((size < 100)?size:100));
和
buffer[nread]='\0';
最后一个元素是buffer[99]
(因为数组索引从0开始,而不是1),但您可以写入buffer[100]
。这可能会导致段错误。
您应该声明所有大小为101的数组,看看它是否有帮助。如果你在Linux上,你也应该在Valgrind中运行你的程序;它可以准确地告诉你segfault是如何发生的。