Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
符号查找错误:未定义的符号:fclose_C_Sockets_Segmentation Fault_Shared Memory - Fatal编程技术网

符号查找错误:未定义的符号:fclose

符号查找错误:未定义的符号:fclose,c,sockets,segmentation-fault,shared-memory,C,Sockets,Segmentation Fault,Shared Memory,我有下面的程序,它基本上实现了一个DNS服务器。共享内存用于实现服务器缓存。我试图通过从文件中读取一些初始条目来填充缓存。但是,当文件条目超出某个点时,就会出现分段错误。我无法自己调试程序 typedef struct rs{ char domainName[256]; char ip[36]; time_t timeStamp; struct rs *cacheEnd; } ResourceRecord; ResourceRecord *cache, *tempCachePtr, *cache

我有下面的程序,它基本上实现了一个DNS服务器。共享内存用于实现服务器缓存。我试图通过从文件中读取一些初始条目来填充缓存。但是,当文件条目超出某个点时,就会出现分段错误。我无法自己调试程序

typedef struct rs{
char domainName[256];
char ip[36];
time_t timeStamp;
struct rs *cacheEnd;
} ResourceRecord;
ResourceRecord *cache, *tempCachePtr, *cacheEnd;
void create_Shared_Memory()         //Creates shared memory 
{
    int stateMemory;
    stateMemory=shmget(IPC_PRIVATE, (MAX_CACHE_SIZE)*sizeof(ResourceRecord *),IPC_CREAT|0660);
    if (stateMemory == -1)
    {
            perror("Shared memory creation");
                exit(EXIT_FAILURE);
        }
    cache=(ResourceRecord *)shmat(stateMemory,NULL,0);
    tempCachePtr = cache;
    if(shmctl(stateMemory,IPC_RMID,NULL)==-1)
    printf("ERROR CREATING CARMODEMEMORY!!!");

    if(cache==NULL)
    {
        perror("Shared memory attach ");
        shmctl(stateMemory,IPC_RMID,NULL);
        exit(EXIT_FAILURE);

    }
}

void populateCache(){
   tempCachePtr = cache+1;
   struct hostent* domainAddress;
   int i;
   ResourceRecord record;
   char * line = NULL;
   size_t fileInputLength = 0;
   ssize_t read;
   puts("Populating cache");
   FILE *fp = fopen("hosts.txt", "r");
   for(i=1;i<=40; i++){
      if((read = getline(&line, &fileInputLength, fp)) == -1){
        break;
      }
      printf("%d From file %s\n",i, line);
      strcpy(record.domainName, strtok(line, " "));
      strcpy(record.ip, strtok(NULL, "\n"));
      time(&record.timeStamp);
      *tempCachePtr = record;
      tempCachePtr++;
   }
   cacheEnd = tempCachePtr-1;
   *(cache->cacheEnd) = cacheEnd;
   fclose(fp);
}
我试着用gdb调试代码,下面是我所拥有的

符号查找错误:/home/path/DNS服务器:未定义符号:fclose,版本 GLIBC_2.2.5[劣质1工艺7178退出,代码0177]

当我尝试更改文件条目的数量并再次调试时:

来自/lib64/ld-linux-x86-64.so.2共享内存的SIGSEGV


正如Anto Jurković指出的,错误在于我使用50*sizeofResourceRecord*创建共享内存,其中sizeofResourceRecord*只有几个字节,因为它是一个指针,但在我的系统中sizeofResourceRecord比8和312大得多。所以50*sizeofResourceRecord*只分配了400字节的内存,这显然不足以容纳40条ResourceRecord类型的记录

我不认为一旦seg故障发生,你就设法进行了回溯?@WhozCraig:不。它们来自单独的调试。对不起,你试过在启用-g开关的情况下编译吗?@SouravGhosh:是的。程序接收信号SIGSEGV,分段故障。0x00007FF7DE3B9B英寸??从/lib64/ld-linux-x86-64.so.2猜测一下:如果您想为50个ResourceRecord分配内存,那么对shmget的调用是错误的,稍后您将覆盖该内存。如果您想为50个指针分配内存,那么应该可以。