0

以下是我从管道函数中读取的代码片段。这可以正确执行并验证数据是否已进入缓冲区。

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 正确加载了该值。但是在我试图调用 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);
}

在 print 语句中获取 sigsegv。

4

1 回答 1

2

您的代码中有一个错误。您的数组有 100 个元素,但您没有考虑 NULL 终止:

strncpy(parmPtr, readMsg, ((size < 100)?size:100));

和:

buffer[nread]='\0';

最后一个元素是buffer[99](因为数组索引从 0 开始,而不是 1),但您可以写入buffer[100]. 这可能会导致段错误。

您可能应该改为声明所有大小为 101 的数组,看看它是否有帮助。如果你在 Linux 上,你也应该在 Valgrind 中运行你的程序;它可以准确地告诉您段错误是如何发生的。

于 2012-12-13T18:19:58.417 回答