我现在正在使用Ubuntu学习C语言的信号量。教授只是把这个代码扔给我们,并要求我们研究和观察。当我编译时,我得到一个警告,提示ctime(&sem_buf.sem_ctime)返回一个int,而不是char *,但没有什么大不了的。当我运行它时,输出仅为:Semaphore identifier: 0 Segmentation fault (core dumped)。对于出了什么问题,我感到非常困惑,我也不知道这段代码中发生了什么。一些帮助将不胜感激。

这是代码:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>
# define NS 3
union semun {
   int val;
   struct semid_ds *buf;
   ushort *array; // Unsigned short integer.
};

int main(void)
{
   int sem_id, sem_value, i;
   key_t ipc_key;
   struct semid_ds sem_buf;
   static ushort sem_array[NS] = {3, 1, 4};
   union semun arg;
   ipc_key = ftok(".", 'S'); // Creating the key.
   /* Create semaphore */
   if ((sem_id = semget(ipc_key, NS, IPC_CREAT | 0666)) == -1) {
      perror ("semget: IPC | 0666");
      exit(1);
   }
   printf ("Semaphore identifier %d\n", sem_id);
   /* Set arg (the union) to the address of the storage location for */
   /* returned semid_ds value */
   arg.buf = &sem_buf;
   if (semctl(sem_id, 0, IPC_STAT, arg) == -1) {
      perror ("semctl: IPC_STAT");
      exit(2);
   }
   printf ("Create %s", ctime(&sem_buf.sem_ctime));
   /* Set arg (the union) to the address of the initializing vector */
   arg.array = sem_array;
   if (semctl(sem_id, 0, SETALL, arg) == -1) {
      perror("semctl: SETALL");
      exit(3);
   }
   for (i=0; i<NS; ++i) {
      if ((sem_value = semctl(sem_id, i, GETVAL, 0)) == -1) {
         perror("semctl : GETVAL");
         exit(4);
      }
      printf ("Semaphore %d has value of %d\n",i, sem_value);
   }
   /*remove semaphore */
   if (semctl(sem_id, 0, IPC_RMID, 0) == -1) {
      perror ("semctl: IPC_RMID");
      exit(5);
   }
}

最佳答案

您需要在编译器识别time.h函数中包含ctime。警告是因为编译器不知道ctime是一个函数并且返回了char*。默认情况下,GCC假定未知函数返回int

关于c - Ubuntu Semaphore:段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33641068/

10-11 14:20