在哪里定义'err_quit'

raz*_*eLe 0 c linux operating-system

我正在研究有关生产者 - 消费者问题的程序(来自我的OS类),当我编译它时,我遇到了这个oroblem:

razrlele@razrlele-ThinkPad:~/work/os$ gcc producerconsumer.c -lpthread -o producerconsumer
/tmp/ccyFGuJk.o: In function `main':
producerconsumer.c:(.text+0xb8): undefined reference to `err_quit'
producerconsumer.c:(.text+0xfc): undefined reference to `err_quit'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我想知道err_quit的定义在哪里?

我的操作系统是Ubuntu-gnome 14.04,这是我的整个程序代码:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <semaphore.h>
  4 #include <pthread.h>
  5 #include <stdlib.h>
  6 
  7 void *producer_handler(void *ptr);
  8 void *consumer_handler(void *ptr);
  9 
 10 sem_t mutex, blank, fill;
 11 int *buffer;
 12 int in = 0, out = 0, buffer_size = 10;
 13 
 14 int main()
 15 {
 16         if((buffer = (int *)malloc(buffer_size *sizeof(int))) == NULL)
 17                 printf("can't allocate memory on heap\n");
 18         sem_init(&mutex, 0, 1);
 19         sem_init(&blank, 0, buffer_size);
 20         sem_init(&fill, 0, 0);
 21 
 22         int err;
 23         pthread_t producer, consumer;
 24         err = pthread_create(&producer, NULL, producer_handler, NULL);
 25         if(err != 0)
 26                 err_quit("can't create thread: %s\n", strerror(err));
 27                 err = pthread_create(&consumer, NULL, consumer_handler, NULL);
 28                 if(err != 0)
 29                         err_quit("can't create thread: %s\n", strerror(err));
 30 
 31         sleep(10);
 32         return 0;
 33 }
 34 
 35 void *producer_handler(void *ptr)
 36 {
 37         while(1)
 38         {
 39                 static int data = 0;
 40                 sem_wait(&blank);
 41                 sem_wait(&mutex);
 42 
 43                 buffer[in] = ++data;
 44                 printf("%d has been input to the buffer\n", data);
 45                 in = (in + 1 + buffer_size)%buffer_size;
 46                 sem_post(&mutex);
 47                 sem_post(&fill);
 48                 sleep(1);
 49         }
 50         return ((void *) 0);
 51 }
 52 
 53 void *consumer_handler(void *ptr)
 54 {
 55         while(1)
 56         {
 57                 int fetch;
 58                 sem_wait(&fill);
 59                 sem_wait(&mutex);
 60                 fetch = buffer[out];
 61                 out = (out + 1 + buffer_size)%buffer_size;
 62                 printf("%d has been fetched\n", fetch);
 63                 sem_post(&mutex);
 64                 sem_post(&blank);
 65                 sleep(2);
 66         }
 67         return ((void *) 0);
 68 }
 69 
Run Code Online (Sandbox Code Playgroud)

rai*_*dev 5

派对迟到了,但也许有人会发现它很有用.

err_quit不是标准的C函数.最有可能的是,您的操作系统教师使用了UNIX环境中的高级编程代码.是第三版的源代码.err_quit定义在include/apue.h,实现在lib/error.c.