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

c - writing to shared memory segment causes segmentation fault

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

编辑:在我删除了 ==(错误)之后,现在我遇到了总线错误(核心已转储),这是编辑后的代码:

// 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);

我想这就是你的问题所在:

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

您正在将 shd 与带“==”的 mmap 的 return 值进行比较。我认为您打算使用单个 '=' 将 return 值分配给 shd.