c - 写入共享内存段会导致分段错误

时间:2015-05-17 22:44:57

标签: c segmentation-fault shared-memory

我在写共享内存段时遇到问题。这是代码:

编辑:我删除了==(错误)之后,现在我收到了Bus Error(Core Dumped),这是编辑后的代码:

// Struct for data from shared memory
typedef struct {
     pthread_mutex_t shared_mutex;
     int last_used_job_id;
} shared1;

static void *job_generator(void *param)
{
     int J = *((int *) param);
     shared1 *shd;
     int shm;
     int job_id;

     // Open shared memory, don't create it if doesn't exist
     shm = shm_open("/lab5", O_RDWR, 00600);

     // Check
     if (shm == -1) {
          // Open shared memory, create it if doesn't exist (O_CREAT)
         shm = shm_open(q_name, O_RDWR | O_CREAT, 00600);

         // Map space for struct
         shd = mmap(NULL, sizeof(shared1), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0); 
         if (shd == (void *) -1) {
              perror ( "mmap" );
              exit(1);
         }

         // Initialize mutex
         if (pthread_mutex_init(&(shd->shared_mutex), NULL) != 0)
         {
              printf("Mutex initialization failed!\n");
              exit(1);
         }
     }

     else
     {
          // Map space for struct
          shd = mmap(NULL, sizeof(shared1), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0);    
          if (shd == (void *) -1) {
              perror ( "mmap" );
              exit(1);
          } 
     }

     // Lock mutex
     pthread_mutex_lock(&(shd->shared_mutex));

     job_id = shd->last_used_job_id + 1;
     shd->last_used_job_id = job_id + J;
     printf("a: %d\n", shd->last_used_job_id);

     return NULL;
}

它是由使用shd的任何指令引起的,所以其中任何一个:

// Lock mutex
pthread_mutex_lock(&(shd->shared_mutex));

job_id = shd->last_used_job_id + 1;
shd->last_used_job_id = job_id + J;
printf("a: %d\n", shd->last_used_job_id);

1 个答案:

答案 0 :(得分:6)

我认为这就是你的问题所在:

shd == mmap(NULL, sizeof(shared1), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0);

您将shd与带有'=='的mmap的返回值进行比较。我想你的意思是使用一个'=',它将返回值分配给shd。