共享内存的分段错误(核心已转储)

时间:2019-05-25 17:34:40

标签: c linux fork shared-memory

代码编译时没有警告或错误,但是如果我运行它,它会说 分段故障(核心已转储)。 我很确定这是一些基本问题,但我只是找不到。 如果有人看了就能找到问题,那就太好了。

我在Linux系统上使用以下命令对其进行编译: -gcc -Wall -pedantic -std = c99 prog.c -o programm

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/sem.h>

#define N_DATA 2000000
#define N_SHARED 2000

int main(int argc, char **argv){

int shmid;
int *array;
int i = 0;
key_t key = 12345;

shmid = shmget(key, 5, IPC_CREAT | 0666);
pid_t pid;
pid = fork();

if ( pid > 0 ) {
 printf("Parent \n E-PID: %d  K-PID: %d \n" , getpid(), pid);

 array = (int*) shmat(shmid, NULL , 0);

  for(i=0; i<5; i++)
  {
    array[i] = i;
  }

 printf("\nWritting to memory succesful--\n");
 shmdt((void *) array);
 }


 if ( pid == 0) {
 sleep(5);
 printf("Son: \n E-PID: %d  K-PID: %d \n" , getpid(), pid);

 array = (int*) shmat(shmid, NULL , SHM_RDONLY);

 for(i=0; i<5; i++)
    {
        printf("\n%d---\n", array[i] );
    }

    printf("\nRead to memory succesful--\n");

    shmdt((void *) array);
 }
}

1 个答案:

答案 0 :(得分:0)

您需要包括shmgetshmatshmdt的头文件:

   #include <sys/ipc.h>
   #include <sys/shm.h>
   #include <sys/types.h>

指针大小与32位上的int大小相同,在C89时,这意味着该代码可以在大多数(即使不是全部)计算机上运行。在64位(指针的大小为longlong long)上不是这种情况,这会导致指针截断。这就是为什么您遇到段错误。

考虑到您在没有warning: implicit declaration of function 'xxx'的情况下进行编译,因此您使用的强制转换会隐藏可能是-pedantic-errors的编译器警告。

隐式函数声明在C99中被标记为已弃用,因此请尝试使用-pedantic-errors进行编译,看看是否存在任何错误。

此外,不要忘记检查shm*函数的返回值。