首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“err_quit”定义在哪里?

“err_quit”定义在哪里?
EN

Stack Overflow用户
提问于 2014-06-03 09:02:53
回答 3查看 7.9K关注 0票数 0

我正在学习有关生产者-消费者问题的程序(来自我的OS类),当我编译它时,我会遇到这样的问题:

代码语言:javascript
复制
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

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

我的操作系统是Ubuntu 14.04,下面是我的整个程序代码:

代码语言:javascript
复制
  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 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-03 09:04:14

没有名为err_quit()的标准函数。你为什么决定用它?

它看起来不太像,所以实现的一个想法可能是:

代码语言:javascript
复制
void err_quit(const char *fmt, ...)
{
  va_list args;

  va_start(args, fmt);
  vfprintf(stderr, fmt, args);
  va_end(args);
  exit(EXIT_FAILURE);
}

当然,这只是基于函数的名称和使用模式的猜测。

票数 1
EN

Stack Overflow用户

发布于 2015-09-05 08:47:13

派对迟到了,但也许有人会觉得它有用。

err_quit不是一个标准的C函数。很可能,您的操作系统老师使用了来自UNIX环境下的高级编程的代码。这里是第三版的源代码。err_quit是用include/apue.h定义的,实现是在lib/error.c中定义的。

票数 8
EN

Stack Overflow用户

发布于 2018-03-19 10:23:07

err_quit()不是一个标准的系统函数,而是一个在控制台上打印的简单错误例程。要获得更多信息,您可以在UNIX环境书附录B部分中查看高级编程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24011090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档