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

Xpl*_*loD 1 c shared-memory 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;
}
Run Code Online (Sandbox Code Playgroud)

它是由任何使用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);
Run Code Online (Sandbox Code Playgroud)

th3*_*0id 6

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

shd == mmap(NULL, sizeof(shared1), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0);
Run Code Online (Sandbox Code Playgroud)

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